【问题标题】:Valid random generation algorithm or not?有效的随机生成算法与否?
【发布时间】:2010-11-02 02:44:41
【问题描述】:
long timeValue = timeInMillis();
int rand = timeValue%100 + 1;

如果我们在一个循环中执行上述代码 N 次,它将生成 N 个 1 到 100 之间的随机数。我知道随机数的生成是一个棘手的问题。只是想知道这是一个好的随机数生成算法吗?还是它是伪随机数生成器?

为什么我认为这会产生对随机行为的良好估计? 1) 1 到 100 的所有 no 都将均匀分布。没有偏见。 2) timeInMillis 会表现出一些随机行为,因为我们永远无法真正猜测 CPU 将在什么时间执行此函数。 CPU中运行着许多不同的任务。所以 timeInMillis() 指令的确切执行时间在循环的下一次迭代中是不可预测的。

【问题讨论】:

  • "这是一个好的数字随机生成算法吗?" - 没有。
  • 最近又发现了一个问题。只是想指出。如果指令的执行有些随机,则不会均匀分布。因此,如果 2) 为真,则 1) 无效。如果 1) 有效 2) 无效。所以看来我的推理是错误的。

标签: random


【解决方案1】:

没有。首先,在大多数处理器上,这将在 1 毫秒内循环多次(可能是完整的 100 次),这将产生 100 个相同的数字。

即使使用计时器滴答来播种随机数生成器也可能很危险 - 计时器滴答很少像您预期的那样“随机”。

【讨论】:

  • “首先,在大多数处理器上,这将在 1 毫秒内循环多次(可能是全部 100 次),这将产生 100 个相同的数字。”这是我错过的一点。感谢提醒 - CPU 周期以纳秒为单位!所以这一点使上面的代码完全错误。但是暂时假设如果 CPU 周期是 1ms,那么你的 cmets 会是多少?
  • 如果你想要一个好的但实用的数字生成器,试试 Mersenne Twister en.wikipedia.org/wiki/Mersenne_twister。有许多语言的开源库实现了这一点,我已经成功地将它用于数字/计算(而不是加密)随机数生成。
  • @Sanjeev,它仍然不会是随机的,因为序列类似于 1、2、3;或 1、3、5、7;或由于采样而略有不均匀,例如。 1,5,10,14,19,24。 Knuth 的《计算机编程艺术》有一章很好地介绍了随机性和测试随机性,尽管实际的算法显然已经过时了。
  • “即使使用计时器滴答来播种随机数生成器也可能很危险 - 计时器滴答很少像您预期的那样“随机”。也拿到了这个。因为行为也将取决于何时计算下一个随机数。因为时间是递增的。如果我在 100ms 秒后计算这个函数,那么每次都有可能得到相同的 no。您已经指出的另一件事-编号可能按升序排列,这不是随机的。感谢您的澄清。所以现在我知道这个代码对于随机数有多糟糕:)
  • 是的,从程序启动(或定时器事件)到种子设置的时间可能不是随机的;并且程序启动可能不是一个完全随机的计时器(取决于操作系统)。实时计时器滴答声也不一定以 1 毫秒的增量递增。例如,我认为旧的 PC 和 AT 会以更大的增量增加(18ms iirc)。
【解决方案2】:

这是我生成随机数的建议:

1- 选择离您所在位置尽可能远的网站。例如如果您在美国,请尝试一些在马来西亚、中国、俄罗斯、印度等国家/地区拥有服务器 IP 的网站。流量大的服务器比较好。

2- 在您所在国家/地区的高互联网流量期间(在我的国家/地区,大约是晚上 7 点到 11 点)多次 ping 这些网站,获取每个 ping 结果(仅使用整数值)并计算模数 2它(即从每个 ping 操作中你得到一个位:0 或 1)。

3-重复这个过程几天,记录结果。

4- 收集您从所有 ping 中获得的所有位(可能您将获得数十万位)并从中选择您的位。 (也许你想通过使用上面提到的相同方法的一些数据来选择你的位:))

小心:在你的代码中你应该检查超时..etc

【讨论】:

  • 插入麦克风并从/dev/audio 读取数据也会产生有用的随机位(尽管相关)。
  • @docesam 这是一个很好的实现。我们通过收集请求的延迟(基于流量的随机行为)来制作数据集。该数据集与时间记录器方法相结合增加了随机性并消除了按升序获取数据的缺点。感谢提及。
  • @Alexandre C 对此了解不多。我们正在收集噪声的随机行为(顺便说一下哪个特征?)。需要进一步阅读。谢谢。
  • @Sanjeev:实际上我使用来自麦克风的随机噪声来获得 PRNG 的好种子。
  • @Alexandre C 我们使用随机噪声作为种子。为什么不使用随机噪声来生成随机编号。为什么需要 PRNG?是不是我们设置种子后,PRNG 计算后续的随机数非常快。虽然直接从 /dev/audio 生成随机数(不使用 PRNG)非常慢。对吗?
猜你喜欢
  • 1970-01-01
  • 2010-09-24
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多