理解“随机性”

时间:2010-10-18 03:40:52

标签: math language-agnostic random

我无法理解这一点,这是更随意的?

rand()

OR

rand() * rand()

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

修改

直观地我知道数学答案将是它们同样随机,但我不禁想到,如果你将两者结合在一起“运行随机数算法”两次,你会创造更随机的东西而不只是做一次。

28 个答案:

答案 0 :(得分:1477)

只是澄清

虽然每当您尝试发现伪随机变量或其乘法的随机性时,先前的答案是正确的,但您应该知道,虽然 Random()通常是均匀分布的,但 Random()* Random()不是。

实施例

这是通过伪随机变量模拟的uniform random distribution sample

Histogram of Random()

        BarChart[BinCounts[RandomReal[{0, 1}, 50000], 0.01]]

虽然这是在将两个随机变量相乘后得到的分布:

Histogram of Random() * Random()

        BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] * 
                                 RandomReal[{0, 1}, 50000], {50000}], 0.01]]

所以,两者都是“随机的”,但它们的分布非常不同。

另一个例子

2 * Random()均匀分布:

Histogram of 2 * Random()

        BarChart[BinCounts[2 * RandomReal[{0, 1}, 50000], 0.01]]

Random()+ Random()不是!

Histogram of Random() + Random()

        BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] + 
                                 RandomReal[{0, 1}, 50000], {50000}], 0.01]]

中心极限定理

Central Limit Theorem表示随着条款的增加, Random()的总和趋于normal distribution

只需四个学期:

Histogram of Random() + Random() + Random() + Random()

BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] + RandomReal[{0, 1}, 50000] +
                   Table[RandomReal[{0, 1}, 50000] + RandomReal[{0, 1}, 50000],
                   {50000}],
         0.01]]  

在这里,您可以通过将1,2,4,6,10和20个均匀分布的随机变量相加来看到从均匀分布到正态分布的道路:

Histogram of different numbers of random variables added

修改

一些学分

感谢Thomas Ahle在评论中指出最后两张图片中显示的概率分布称为Irwin-Hall distribution

感谢Heike感谢torn[] function

答案 1 :(得分:151)

我猜两种方法都是随机的,虽然我的gutfeel会说rand() * rand()随机性较小,因为它会播种更多的零。只要一个rand()0,则总数变为0

答案 2 :(得分:81)

两者都不是'随机'。

rand()根据伪随机种子(通常基于当前时间,总是在变化)生成一组可预测的数字。将序列中的两个连续数字相乘可以生成不同但同样可预测的数字序列。

解决这是否会减少碰撞,答案是否定的。实际上,由于两个数字乘以0 < n < 1的影响,它会增加碰撞。结果将是一个较小的部分,导致结果偏向光谱的低端。

进一步解释。在下文中,“不可预测的”和“随机的”是指某人根据先前的数字猜测下一个数字的能力,即。一个神谕。

给定种子x生成以下值列表:

0.3, 0.6, 0.2, 0.4, 0.8, 0.1, 0.7, 0.3, ...

rand()将生成以上列表,rand() * rand()将生成:

0.18, 0.08, 0.08, 0.21, ...

两种方法总是为同一种子生成相同的数字列表,因此oracle可以同样预测。但是如果你看一下两个调用相乘的结果,你会看到它们都在0.3下,尽管原始序列中的分布很不错。由于两个分数相乘的影响,数字有偏差。由此产生的数字总是较小,因此更有可能是碰撞,尽管仍然是不可预测的。

答案 3 :(得分:79)

过度简化以说明观点。

假设您的随机函数仅输出01

random()(0,1)之一,但random()*random()(0,0,0,1)

之一

您可以清楚地看到,在第二种情况下获得0的机会绝不等于获得1的机会。


当我第一次发布这个答案时,我希望尽可能地缩短它,以便阅读它的人一眼就能理解random()random()*random()之间的区别,但我无法保持我自己回答了原来的广告问题:

哪个更随机?

由于random()random()*random()random()+random()(random()+1)/2或任何其他不会导致固定结果的组合具有相同的熵源(或者在伪随机生成器的情况下,相同的初始状态),答案是它们同等随机(差异在于它们的分布)。我们可以看到的一个完美的例子是Craps游戏。你得到的数字是random(1,6)+random(1,6),我们都知道获得7的机率最高,但这并不意味着滚动两个骰子的结果或多或少是随机滚动的结果。

答案 4 :(得分:68)

这是一个简单的答案。考虑垄断。你滚动两个六面骰子(或者对于那些喜欢游戏符号的人来说是2d6)并拿走它们的总和。最常见的结果是7,因为有6种可能的方法可以滚动7(1,6 2,5 3,4 4,3 5,2和6,1)。而2只能在1,1上滚动。很容易看出滚动2d6与滚动1d12不同,即使范围相同(忽略你可以在1d12上获得1,这一点保持不变)。将结果相乘而不是添加结果会使它们以类似的方式偏斜,大部分结果都会出现在范围的中间。如果你想减少异常值,这是一个很好的方法,但它无助于均匀分布。

(奇怪的是它也会增加低点。假设你的随机性从0开始,你会看到一个0的尖峰,因为它会将其他掷骰变成0。考虑0和0之间的两个随机数。如果任一结果为0,则无论其他结果如何,整个事物都变为0。获得1的唯一方法是两个滚动为1。实际上这可能不会没关系,但这会产生一个奇怪的图表。)

答案 5 :(得分:53)

强制性xkcd ...
return 4; // chosen by fair dice roll, guaranteed to be random.

答案 6 :(得分:35)

这可能有助于以更离散的数字来考虑这一点。考虑想要生成1到36之间的随机数,所以你决定最简单的方法是投掷两个公平的6面骰子。你明白了:

     1    2    3    4    5    6
  -----------------------------
1|   1    2    3    4    5    6
2|   2    4    6    8   10   12
3|   3    6    9   12   15   18
4|   4    8   12   16   20   24   
5|   5   10   15   20   25   30
6|   6   12   18   24   30   36

所以我们有36个数字,但并非所有数字都被公平表示,有些根本没有出现。中心对角线附近的数字(左下角到右上角)将以最高频率出现。

描述骰子之间不公平分布的相同原则同样适用于0.0到1.0之间的浮点数。

答案 7 :(得分:26)

关于“随机性”的一些事情是违反直觉的。

假设rand()分布不均,以下内容将为您提供非平面分布:

  • 偏见:sqrt(rand(range^2))
  • 偏向中间的高峰:(rand(range) + rand(range))/2
  • low:bias:range - sqrt(rand(range^2))

还有很多其他方法可以创建特定的偏差曲线。我对rand() * rand()进行了快速测试,它会让你得到非常非线性的分布。

答案 8 :(得分:23)

大多数rand()实现都有一段时间。即经过一些大量的调用后,序列重复出现。 rand() * rand()的输出序列在一半的时间内重复,因此在这种意义上它“不那么随机”。

此外,如果不仔细构造,对随机值执行算术往往会导致较少的随机性。上面的海报引用了“rand() + rand() + rand() ...”(k次,比如说),实际上往往是k倍值范围的平均值{{ 1}}返回。 (这是一个随机的步行,步骤对称的意思。)

假设你的rand()函数返回[0,1]范围内均匀分布的随机实数的具体性。 (是的,这个例子允许无限精度。这不会改变结果。)你没有选择一种特定的语言,不同的语言可能做不同的事情,但下面的分析适用于任何非反常的rand实现的修改( )。乘积rand()也在[0,1]范围内,但不再均匀分布。事实上,该产品可能在区间[0,1 / 4]中与区间[1 / 4,1]中一样。更多的乘法会使结果进一步偏向零。这使得结果更加可预测。从广义上看,更可预测==更少随机。

几乎任何对均匀随机输入的操作序列都是非均匀随机的,从而提高了可预测性。小心翼翼,人们可以克服这个属性,但是在你真正想要的范围内生成一个均匀分布的随机数会更容易,而不是浪费算术时间。

答案 9 :(得分:23)

“随机”与“更随机”有点像询问哪个零点更为零。

在这种情况下,rand是PRNG,因此不是完全随机的。 (事实上​​,如果已知种子,则可以预测)。将它乘以另一个值使其不会或多或少随机。

真正的加密型RNG实际上是随机的。通过任何类型的函数运行值都不能为它添加更多的熵,并且很可能会删除熵,使其不再随机。

答案 10 :(得分:19)

您正在寻找的概念是“熵”,即字符串无序的“程度” 比特。根据“最大熵”的概念,这个想法最容易理解。

具有最大熵的一串比特的近似定义是它不能用较短的比特串来精确表达(即使用某种算法来 将较小的字符串展开回原始字符串。)

最大熵与随机性的相关性源于这样一个事实 如果你“随机”选择一个数字,你几乎肯定会选择一个数字 其位串接近于具有最大熵,即,它不能被压缩。 这是我们对“随机”数字特征的最佳理解。

所以,如果你想用两个随机样本中的随机数作为“两次” 随机,你将串联两个位串。实际上,你只是 将样本填入双长字的高低两半。

更实际的是,如果你发现自己背负着蹩脚的兰德(),那就可以了 有时可以帮助将几个样本合在一起---尽管如果它真的破坏了 那个程序无济于事。

答案 11 :(得分:13)

接受的答案非常可爱,但还有另一种方法可以回答你的问题。 PachydermPuncher's answer已采用这种替代方法,我只想稍微扩展一下。

考虑信息理论的最简单方法是根据最小的信息单位,一点点。

在C标准库中,rand()返回0到RAND_MAX范围内的整数,这个限制可能会根据平台的不同而有所不同。假设RAND_MAX碰巧被定义为2^n - 1,其中n是一个整数(在Microsoft的实现中恰好是这种情况,其中n是15)。然后我们会说一个好的实现会返回n个信息。

想象一下rand()通过翻转硬币来找到一位的值来构造随机数,然后重复直到它有一批15位。然后这些位是独立的(任何一位的值都不会影响同一批中其他位具有特定值的可能性)。因此,独立考虑的每个位都像0到1之间的随机数,并且在该范围内“均匀分布”(可能为0为1)。

位的独立性确保了批量位表示的数字也将在其范围内均匀分布。这是直观明显的:如果有15位,则允许的范围为零到2^15 - 1 = 32767.该范围内的每个数字都是唯一的位模式,例如:

010110101110010

如果这些位是独立的,则没有模式比任何其他模式更可能发生。因此,范围内的所有可能数字都是可能的。反之亦然:如果rand()产生均匀分布的整数,则这些数字由独立的位组成。

因此,将rand()视为制作位的生产线,恰好可以批量生产它们。如果您不喜欢这个尺寸,请将批次分成几个部分,然后将它们放回到您喜欢的任何数量(尽管如果您需要一个不是2的幂的特定范围,您需要缩小数字,到目前为止,最简单的方法是转换为浮点数。)

回到原来的建议,假设您想从15个批次到30个批次,请rand()获取第一个数字,将其移位15个位置,然后添加另一个rand()它。这是一种将两个调用组合到rand()而不会影响均匀分布的方法。它的工作原理很简单,因为放置信息位的位置之间没有重叠。

这与通过乘以常数来“拉伸”rand()的范围非常不同。例如,如果你想将rand()的范围加倍,你可以乘以2 - 但现在你只得到偶数,而不是奇数!这不是一个平滑的分布,可能是一个严重的问题,取决于应用程序,例如一个类似轮盘赌的游戏,据说允许奇数/偶数投注。 (通过思考比特,你可以直观地避免这个错误,因为你已经意识到乘以2与将位向左移位(更大的重要性)一个位置并用零填充间隙是相同的。显然,信息量是相同的 - 它只是稍微移动了一点。)

在浮点数应用程序中,数字范围内的这种间隙不容小觑,因为浮点范围本身就存在间隙,根本无法表示:无限数量的缺失实数数字存在于每两个可表示的浮点数之间的差距中!因此,无论如何我们必须学会忍受差距。

正如其他人所警告的那样,直觉在这个领域是有风险的,特别是因为数学家无法抵挡实数的诱惑,实际数字是充满了粗糙无限和明显矛盾的极其混乱的东西。

但至少如果你认为它的位数,你的直觉可能会让你更进一步。比特非常简单 - 即使计算机也能理解它们。

答案 12 :(得分:12)

答案 13 :(得分:11)

考虑到你有一个简单的硬币翻转问题,即使被认为是头,奇数被认为是尾巴。逻辑实现是:

rand() mod 2

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

现在考虑稍微调整一下:

rand() * rand() mod 2

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

如果我是你,我会打赌。

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

答案 14 :(得分:10)

如果您对随机数的组合会发生什么不确定,您可以使用您在统计理论中学到的经验教训。

在OP的情况下,他想知道X * X = X ^ 2的结果是什么,其中X是沿均匀[0,1]分布的随机变量。我们将使用CDF技术,因为它只是一对一的映射。

由于X~Uniform [0,1]它的cdf是:f X (x)= 1 我们希望变换Y&lt; -X ^ 2因此y = x ^ 2 找到逆x(y):sqrt(y)= x这给出了x作为y的函数。 接下来,找出导数dx / dy:d / dy(sqrt(y))= 1 /(2 sqrt(y))

Y的分布如下:f Y (y)= f X (x(y))| dx / dy | = 1 /(2 sqrt(y))

我们还没有完成,我们必须得到Y的域,因为0&lt; = x&lt; 1,0 <= x ^ 2&lt; 1 所以Y在[0,1]范围内。 如果你想检查Y的pdf是否确实是pdf,请将其整合到域Integrate 1/(2 sqrt(y)) from 0 to 1上,实际上,它会弹出为1.另外,请注意所述函数的形状看起来像belisarious发布的那样。 / p>

对于X 1 + X 2 + ... + X n 之类的东西,(其中X i ~Uniform [0,1])我们可以诉诸于中心极限定理,该定理适用于任何时刻存在的分布。这就是Z测试实际存在的原因。

确定结果pdf的其他技术包括雅可比变换(这是cdf技术的通用版本)和MGF技术。

编辑:作为澄清,请注意我所说的结果转换的发布而不是随机性。这实际上是为了单独讨论。我实际上得到的是(rand())^ 2。对于rand()* rand()来说,它要复杂得多,在任何情况下都不会导致任何种类的均匀分布。

答案 15 :(得分:9)

这并不是很明显,但rand()通常比rand()*rand()更随机。重要的是,这对大多数用途来说实际上并不重要。

但首先,它们会产生不同的分布。 这不是问题如果这是你想要的,但它确实很重要。如果您需要特定的分布,那么忽略整个“哪个更随机”的问题。那么为什么rand()更随机呢?

为什么rand()更随机的核心(假设它产生的范围为[0..1]的浮点随机数,这是非常常见的)是当你乘以两个FP时数字与尾数中的大量信息一起,最终会丢失一些信息;在IEEE双精度浮点数中没有足够的位来保存从[0..1]中随机选择的两个IEEE双精度浮点数中的所有信息,并且这些额外的信息位丢失。当然,这并不重要,因为你(可能)不会使用那些信息,但损失是真实的。您生成的分发(即,您使用哪种操作进行组合)并不重要。这些随机数中的每一个都具有(最多)52位随机信息 - 这是IEEE双重可以容纳多少 - 如果将两个或更多个组合成一个,则仍然限制为最多具有52位随机信息。

随机数的大多数使用甚至没有使用随机源中实际可用的随机性。获得一个好的PRNG,不要太担心它。 (“善”的级别取决于你正在做什么;在进行蒙特卡罗模拟或加密时你必须小心,否则你可以使用标准的PRNG,因为它通常要快得多。)

答案 16 :(得分:7)

根据您的计算机架构,乘数可能会在较小的解决方案范围内结束。

如果您的计算机显示屏显示16位rand(),则表示为0.1234567890123 乘以秒rand(),0.1234567890123,会得到0.0152415的东西 如果你重复实验10 ^ 14次,你肯定会找到更少的解决方案。

答案 17 :(得分:7)

浮动随机数通常基于生成0到某个范围之间的整数的算法。因此,通过使用rand()* rand(),你实际上是在说int_rand()* int_rand()/ rand_max ^ 2 - 意味着你要排除任何素数/ rand_max ^ 2.

显着改变了随机分布。

rand()在大多数系统上均匀分布,如果播种得当,很难预测。使用它,除非你有特殊的理由对它进行数学运算(即,将分布整形为所需的曲线)。

答案 18 :(得分:3)

大多数这些发行都是因为你必须限制或规范化随机数。

我们将它标准化为全部正数,拟合在一个范围内,甚至适合指定变量类型的内存大小约束。

换句话说,因为我们必须限制0和X之间的随机调用(X是我们变量的大小限制),我们将有一组介于0和X之间的“随机”数字。

现在,当您将随机数添加到另一个随机数时,总和将介于0到2X之间...这会使值偏离边缘点(将两个小数字加在一起的概率和两个大数字在一起是当你在一个大范围内有两个随机数时非常小)。

考虑一下你的数字接近于零并且你用另一个随机数添加它的情况它肯定会变得更大并且远离0(这对于大数字也是如此,并且它不太可能有随机函数返回的两个大数字(接近X的数字)两次。

现在,如果您要设置带有负数和正数的随机方法(跨越零轴平均跨越),则不再是这种情况。

比如说RandomReal({-x, x}, 50000, .01)然后你会得到一个正面的负数均匀分布,如果你要将随机数加在一起,它们就会保持“随机性”。

现在我不确定Random() * Random()会发生什么情况会发生负面到正面...这将是一个有趣的图表......但我现在必须回到编写代码。 :-P

答案 19 :(得分:2)

  1. 没有 more 随机的东西。它是随机的还是非随机的。随机意味着“难以预测”。它并不意味着非确定性。如果random()是随机的,random()和random()* random()都是随机的。就随机性而言,分布是无关紧要的。如果发生非均匀分布,则仅意味着某些值比其他值更可能;它们仍然无法预测。

  2. 由于涉及伪随机性,因此数字非常具有确定性。然而,伪随机性在概率模型和模拟中通常是足够的。众所周知,使伪随机数发生器复杂化只会使分析变得困难。它不太可能改善随机性;它常常导致统计测试失败。

  3. 随机数的理想属性很重要:重复性和再现性,统计随机性,(通常)均匀分布,大周期是少数。

  4. 关于随机数的变换:正如有人所说,两个或多个均匀分布的总和导致正态分布。这是加法中心极限定理。只要所有分布都是独立且相同的,它就适用于所有分布而不管源分布。 乘法中心极限定理表示两个或多个独立且非均匀分布的随机变量的乘积是对数正态的。其他人创建的图表看起来是指数级的,但它确实是对数正态的。因此random()* random()是对数正态分布的(尽管它可能不是独立的,因为数字是从同一个流中提取的)。在某些应用中这可能是合乎需要的。但是,通常最好生成一个随机数并将其转换为对数正态分布数。 Random()* random()可能难以分析。

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

答案 20 :(得分:1)

我们可以通过使用来比较关于随机性的两个数字数组 Kolmogorov complexity 如果数字序列无法压缩,那么它是我们在这个长度上可以达到的最随机的... 我知道这种测量更像是一种理论选择......

答案 21 :(得分:1)

实际上,当您考虑它时rand() * rand() 随机<{1}}。这就是原因。

基本上,奇数与偶数相同。并且说0.04325是奇数,并且像0.388是偶数,0.4是偶数,0.15是奇数,

这意味着rand() 等于偶数或奇数十进制

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

rand() * rand()

double a = rand(); double b = rand(); double c = a * b; a都有50%的偶数或奇数。知道了

  • even * even = even
  • 偶数*奇数=偶数
  • odd * odd = odd
  • odd * even = even

意味着<{>> 75%的机会 b是偶数,而只有 25%的机会它是奇数,使得crand() * rand()更可预测,因此随机性更低。

答案 22 :(得分:0)

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

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

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

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

例如,32位LFSR将从给定种子开始依次生成2 ^ 32个唯一数字(不相同)。 序列总是以相同的顺序排列,但起点与不同的种子(显然)不同。 因此,如果种子之间可能重复的序列不成问题,这可能是一个不错的选择。

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

答案 23 :(得分:0)

假设rand()返回[0, 1)之间的数字,很明显rand() * rand()会偏向0。这是因为x乘以{{1}之间的数字将导致小于[0, 1)的数字。以下是10000 more 随机数的分布:

x
google.charts.load("current", { packages: ["corechart"] });
google.charts.setOnLoadCallback(drawChart);

function drawChart() {
  var i;
  var randomNumbers = [];
  for (i = 0; i < 10000; i++) {
    randomNumbers.push(Math.random() * Math.random());
  }
  var chart = new google.visualization.Histogram(document.getElementById("chart-1"));
  var data = new google.visualization.DataTable();
  data.addColumn("number", "Value");
  randomNumbers.forEach(function(randomNumber) {
    data.addRow([randomNumber]);
  });
  chart.draw(data, {
    title: randomNumbers.length + " rand() * rand() values between [0, 1)",
    legend: { position: "none" }
  });
}

如果<script src="https://www.gstatic.com/charts/loader.js"></script> <div id="chart-1" style="height: 500px">Generating chart...</div>返回rand()之间的整数,那么您将获得以下分布。注意奇数与偶数值的数量:

[x, y]
google.charts.load("current", { packages: ["corechart"] });
google.charts.setOnLoadCallback(drawChart);
document.querySelector("#draw-chart").addEventListener("click", drawChart);

function randomInt(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

function drawChart() {
  var min = Number(document.querySelector("#rand-min").value);
  var max = Number(document.querySelector("#rand-max").value);
  if (min >= max) {
    return;
  }
  var i;
  var randomNumbers = [];
  for (i = 0; i < 10000; i++) {
    randomNumbers.push(randomInt(min, max) * randomInt(min, max));
  }
  var chart = new google.visualization.Histogram(document.getElementById("chart-1"));
  var data = new google.visualization.DataTable();
  data.addColumn("number", "Value");
  randomNumbers.forEach(function(randomNumber) {
    data.addRow([randomNumber]);
  });
  chart.draw(data, {
    title: randomNumbers.length + " rand() * rand() values between [" + min + ", " + max + "]",
    legend: { position: "none" },
    histogram: { bucketSize: 1 }
  });
}

答案 24 :(得分:-1)

好的,所以我会尝试添加一些值来补充其他答案,说你正在创建并使用随机数生成器。

随机数生成器是具有多个特征的设备(在一般意义上),可以修改这些特征以适合目的。他们中的一些人(来自我)是:

  • 熵:如香农熵
  • 分布:统计分布(泊松,正常等)
  • 类型:数字的来源(算法,自然事件,组合等)和应用的算法。
  • 效率:执行的快速性或复杂性。
  • 模式:周期性,序列,运行等。
  • 可能更多......

在这里的大多数答案中,分布是主要的兴趣点,但通过混合和匹配函数和参数,您可以创建新的方法来生成随机数,这些随机数具有不同的特征,其中一些评估可能一开始并不明显。一目了然。

答案 25 :(得分:-1)

很容易证明两个随机数的总和不一定是随机的。想象一下,你有一个6面模具和滚动。每个数字都有1/6出现的机会。现在说你有2个骰子并总结了结果。这些总和的分布不是1/12。为什么?因为某些数字比其他数字更多。它们有多个partitions。例如,数字2是1 + 1的总和,但7可以由3 + 4或4 + 3或5 + 2等形成...所以它有更大的机会出现。

因此,应用变换,在这种情况下,对随机函数的加法不会使其更随机,或者必然保持随机性。在上面的骰子的情况下,分布倾向于7,因此随机性较小。

答案 26 :(得分:-1)

正如其他人已经指出的那样,这个问题难以回答,因为我们每个人都有自己的自己的随机性图片

这就是为什么,我强烈建议您花一些时间阅读本网站,以便更好地了解随机性:

回到真正的问题。 在这个术语中没有或多或少随机:

两者都只是随机出现

在这两种情况下 - 只是rand()或rand()* rand() - 情况是一样的: 在几十亿个数字之后,序列将重复(!) 对观察者来说是 随机的,因为他不知道整个序列,但计算机有没有真正的随机源 - 所以他不能产生随机性。

例如:天气是随机的吗? 我们没有足够的传感器或知识来确定天气是否随机。

答案 27 :(得分:-2)

答案取决于它,希望rand()* rand()比rand()更随机,但是:

  • 两个答案取决于您的值的位大小
  • 在大多数情况下,你会根据伪随机算法生成(大多数数字生成器取决于你的计算机时钟,而不是随机的)。
  • 让你的代码更具可读性(而不是用这种口头禅来调用一些随意的伏都教神)。

好吧,如果您检查上述任何一项,我建议您选择简单的“rand()”。 因为你的代码会更强可读(不会问你自己为什么写这个,因为...好......超过2秒),易于维护(如果你想要替换你带有super_rand的rand函数。

如果你想要一个更好的随机,我建议你从任何提供足够噪音的源(无线电静态)流式传输它,然后一个简单的rand()就足够了。 / p>