我无法理解这个,哪个更随机?

rand()

OR:

rand() * rand()

我发现这是一个真正的脑筋急转弯,你能帮我吗?


编辑:

直觉上,我知道数学上的答案是它们是同样随机的,但我不禁想,如果你在将两者相乘时“运行随机数算法”两次,你会创建比只做一次更随机的东西。


当前回答

事实上,仔细想想rand()*rand(()比rand(。原因如下。

基本上,奇数和偶数的数量相同。假设0.04325是奇数,像0.388是偶数,0.4是偶数,0.15是奇数,

这意味着rand()有相等的机会成为偶数或奇数小数。

另一方面,rand()*rand(()的几率有点不同。让我们说:

double a = rand();
double b = rand();
double c = a * b;

a和b都有50%的几率是偶数或奇数。知道这一点

偶数*偶数=偶数偶数*奇数=偶数奇数*奇数=奇数奇数*偶数=偶数

这意味着c有75%的几率是偶数,而只有25%的几率是奇数,这使得rand()*rand(()的值比rand)更可预测,因此随机性更小。

其他回答

使用实现原始多项式的线性反馈移位寄存器(LFSR)。

结果将是一个2^n个伪随机数的序列,即在序列中没有重复,其中n是LFSR中的位数。。。。导致均匀分布。

http://en.wikipedia.org/wiki/Linear_feedback_shift_registerhttp://www.xilinx.com/support/documentation/application_notes/xapp052.pdf

使用基于计算机时钟的微信号的“随机”种子,或者可能是文件系统中一些不断变化的数据的md5结果的子集。

例如,32位LFSR将从给定种子开始按顺序生成2^32个唯一数字(没有2个相同)。序列将始终按照相同的顺序,但对于不同的种子,起点将不同(显然)。因此,如果种子之间可能重复的序列不是问题,那么这可能是一个不错的选择。

我已经使用128位LFSR在硬件模拟器中使用种子生成随机测试,该种子是对不断变化的系统数据的md5结果。

假设你有一个简单的硬币翻转问题,偶数被认为是正面,奇数被认为是反面。逻辑实现是:

rand() mod 2

在足够大的分布范围内,偶数的数量应该等于奇数的数量。

现在考虑一个小小的调整:

rand() * rand() mod 2

如果其中一个结果是偶数,那么整个结果应该是偶数。考虑4种可能的结果(偶*偶=偶,偶*奇=偶,奇*偶=偶数,奇*奇=奇数)。现在,在足够大的分布范围内,答案应该是75%的时间。

如果我是你,我敢打赌。

这条评论实际上更多的是解释为什么不应该基于您的方法实现自定义随机函数,而不是讨论随机性的数学财产。

没有比这更随机的了。它要么是随机的,要么不是随机的。随机意味着“难以预测”。这并不意味着不确定性。如果random()是随机的,那么random(()和random(*random)都是随机的。就随机性而言,分布是无关紧要的。如果出现不均匀分布,则意味着某些值比其他值更有可能;它们仍然是不可预测的。由于涉及伪随机性,所以这些数字非常具有确定性。然而,在概率模型和模拟中,伪随机性通常是足够的。众所周知,使伪随机数生成器复杂化只会使其难以分析。不太可能提高随机性;它经常导致它无法通过统计测试。随机数的期望财产很重要:重复性和再现性、统计随机性、(通常)均匀分布和大周期是少数几个。关于随机数上的变换:正如有人所说,两个或多个均匀分布的和产生正态分布。这是加法中心极限定理。无论源分布如何,只要所有分布都是独立和相同的,它都适用。乘性中心极限定理表示两个或多个独立且一致分布的随机变量的乘积是对数正态的。其他人创建的图形看起来是指数型的,但实际上是对数正态的。因此random()*random(()是对数正态分布的(尽管它可能不是独立的,因为数字是从同一个流中提取的)。这在某些应用中可能是期望的。然而,通常最好生成一个随机数并将其转换为对数正态分布数。Random()*Random()可能很难分析。

欲了解更多信息,请访问www.performorama.org查阅我的书。这本书正在建设中,但相关材料已经存在。请注意,章节和章节编号可能会随时间而变化。第8章(概率论)——第8.3.1和8.3.3节,第10章(随机数)。

这里有一个简单的答案。考虑垄断。你掷两个六面骰子(对于喜欢游戏符号的人来说是2d6),然后求和。最常见的结果是7,因为有6种可能的方式可以掷7(1,6,5,3,44,3,5,2和6,1)。而2只能在1,1上滚动。很容易看出,掷1d6和掷1d12是不同的,即使范围相同(忽略1d12上可以得到1,点保持不变)。将结果相乘而不是相加会以类似的方式扭曲它们,因为大多数结果都位于范围的中间。如果您试图减少异常值,这是一个好方法,但它无助于使分布均匀。

(奇怪的是,它也会增加低掷。假设你的随机性从0开始,你会看到一个峰值在0,因为它会将其他掷骰变成0。考虑两个介于0和1(包括0和1)之间的随机数,然后相乘。如果其中一个结果为0,则无论其他结果如何,整个结果都将变为0。从中得到1的唯一方法是两卷都是1。在实践中,这可能无关紧要,但这会形成一个奇怪的图形。)

强制性的xkcd。。。