前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >什么是随机和伪随机

什么是随机和伪随机

作者头像
PhoenixZheng
发布2018-08-07 16:19:04
1.2K0
发布2018-08-07 16:19:04
举报
文章被收录于专栏:Phoenix的Android之旅

不知道你有没有参与过公司年会,

互联网公司的年会抽奖环节正常都是用自己写的软件抽奖的, 然后我们经常会看到每年年会期间有些公司会在年会上现场 review抽奖代码, 基本都是觉得他丫的这是不是真的随机抽奖?

其实真正的随机是不存在的, 至少在代码层面不存在, 因为随机数在代码层面都是用算法来计算, 而算法只能通过优化来确保随机数在某个空间上均匀分布。

理想的随机数

打个比方, 如果在0 - 100 里面生成 一万个随机数, 那么结果应该是这一万个数均匀分布在 0 - 100 这个区间, 也可以理解为每个数出现的次数基本一致。 而伪随机的话就可能出现很多情况了, 比如正态分布,随机数集中在中间的区间。

如何接近理想的生成随机数

为了让结果尽可能接近理想情况, 我们需要让每一次生成的结果和之前的结果有关联。

这里就有个种子的概念, 以Java的 Random类来说, 生成 Random对象有两种方式,

代码语言:javascript
复制
Random r1 = new Random();
Random r2 = new Random(100);

System.out.println(r1.nextInt(10));
System.out.println(r2.nextInt(10));

第二种就是用种子 100来生成一个随机对象。

这里的原理是, Random会用算法把 100 转换成随机数区间 0 - 10 中某一个点, 之后生成的随机数都会与上一次结果有关而且呈均匀分布。

虽然这样子可以生成接近理想的随机数, 但是也有个严重的问题, 如果我们用同样的种子去生成随机数的话, 就可能导致结果是可以预测的。

种子的选择

来看看下面这段代码, 你可以把它放到自己的环境上运行,看结果是不是跟我的一样。

代码语言:javascript
复制
import java.util.Random;

public class RandomTest {
  public static void main(String[] args) {
    Random r1 = new Random();
    Random r2 = new Random();
    Random r3 = new Random(100);
    Random r4 = new Random(100);

    System.out.println(r1.nextInt(10));
    System.out.println(r1.nextInt(10));
    System.out.println(r2.nextInt(10));
    System.out.println(r2.nextInt(10));
    System.out.println("<------------>");
    System.out.println(r3.nextInt(10));
    System.out.println(r3.nextInt(10));
    System.out.println(r4.nextInt(10));
    System.out.println(r4.nextInt(10));
  }
}

我这边的输出结果是

9 3 2 0 <------------> 5 0 5 0

可以看看你的代码在分割线下面生成的随机数是不是跟我一样。 如果没有意外的话, 你会得到跟我一致的结果。 这里的原因就是种子, 当选用同样的种子时,在同样的算法下,在相同区间中生成的随机数序列是一致的, 也就是说如果年会的抽奖算法用了某一个固定的种子, 那么结果早在年会前就确定了。

所以想要生成一个尽可能完美的结果的话, 种子要尽可能的随性, 比如取系统当前时间,再取参与人数取模或者取余, 这样才能保证随机数的不确定性。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-05-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android每日一讲 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 理想的随机数
  • 如何接近理想的生成随机数
  • 种子的选择
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档