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

rand()

OR:

rand() * rand()

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


编辑:

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


当前回答

你要寻找的概念是“熵”,即弦的无序程度位。从“最大熵”的概念来看,这个概念最容易理解。

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

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

所以,如果你想从两个随机样本中产生一个随机数,它是随机,将两个位字符串连接在一起。实际上,你只是将样本填充到双倍长度单词的高半部分和低半部分。

从更实际的角度来看,如果你发现自己背负着一个蹩脚的rand(),它可以有时有助于将两个样本混合在一起——尽管,如果真的是盈亏平衡的话那个程序没用。

其他回答

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

在这种情况下,rand是PRNG,所以不是完全随机的。(事实上,如果种子是已知的,那是完全可以预测的)。将其乘以另一个值,使其不再随机。

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

假设rand()返回一个介于[0,1)之间的数字,很明显rand(*rand)将偏向于0。这是因为将x乘以[0,1)之间的数字将得到一个小于x的数字。下面是10000个随机数的分布:

google.charts.load(“current”,{packages:[“corechart”]});google.cacharts.setOnLoadCallback(drawChart);函数drawChart(){变量i;var randomNumbers=[];对于(i=0;i<10000;i++){randomNumbers.push(Math.rrandom()*Math.random());}var chart=新的google.visability.Histogram(document.getElementById(“chart-1”));var data=新的google.visibility.DataTable();data.addColumn(“数字”,“值”);randomNumbers.forEach(函数(randomNumber){data.addRow([randomNumber]);});chart.draw(数据{title:randomNumbers.length+“rand()*rand(值介于[0,1)之间”,图例:{位置:“无”}});}<script src=“https://www.gstatic.com/charts/loader.js“></script><div id=“chart-1”style=“height:500px”>正在生成图表</分区>

如果rand()返回[x,y]之间的整数,则得到以下分布。注意奇数与偶数的数量:

google.charts.load(“current”,{packages:[“corechart”]});google.cacharts.setOnLoadCallback(drawChart);document.querySelector(“#绘制图表”).addEventListener(“单击”,绘制图表);函数randomInt(最小值,最大值){return Math.floor(Math.random()*(max-min+1))+min;}函数drawChart(){var min=编号(document.querySelector(“#rand min”).value);var max=编号(document.querySelector(“#rand max”).value);如果(最小值>=最大值){回来}变量i;var randomNumbers=[];对于(i=0;i<10000;i++){randomNumbers.push(randomInt(最小,最大)*randomInt(最小,最小));}var chart=新的google.visability.Histogram(document.getElementById(“chart-1”));var data=新的google.visibility.DataTable();data.addColumn(“数字”,“值”);randomNumbers.forEach(函数(randomNumber){data.addRow([randomNumber]);});chart.draw(数据{title:randomNumbers.length+“rand()*rand(()值介于[“+min+”,“+max+”]”之间,图例:{位置:“无”},直方图:{bucketSize:1}});}<script src=“https://www.gstatic.com/charts/loader.js“></script><input-type=“number”id=“rand-min”value=“0”min=“0“max=“10”><input type=“number”id=“rand max”value=“9”min=“0”max=“10”><input type=“button”id=“draw chart”value=“Apply”><div id=“chart-1”style=“height:500px”>正在生成图表</分区>

当你对随机数的组合会发生什么感到怀疑时,你可以利用你在统计理论中学到的经验。

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

由于X~Uniform[0,1],其cdf为:fX(X)=1我们需要转换Y<-X^2,因此Y=X^2求逆x(y):sqrt(y)=x,这给出了x作为y的函数。接下来,求导数dx/dy:d/dy(sqrt(y))=1/(2sqrt(y)

Y的分布如下:fY(Y)=fX(x(Y))|dx/dy |=1/(2 sqrt(Y)

我们还没有完成,我们必须得到Y的域,因为0<=x<1,0<=x^2<1因此Y在范围[0,1)内。如果你想检查Y的pdf是否真的是pdf,请在域中集成它:从0到1集成1/(2 sqrt(Y)),实际上,它会弹出为1。此外,请注意所述函数的形状看起来像belisarious发布的内容。

至于X1+X2+…+Xn,(其中Xi ~一致[0,1]),我们可以求助于中心极限定理,它适用于存在矩的任何分布。这就是Z检验存在的原因。

用于确定生成的pdf的其他技术包括雅可比变换(这是cdf技术的广义版本)和MGF技术。

编辑:作为澄清,请注意,我所说的是结果转换的分布,而不是其随机性。这实际上是一个单独的讨论。我实际上得到的是(rand())^2。对于rand()*rand((),它要复杂得多,无论如何,这不会导致任何类型的均匀分布。

两者都不是“更随机”的。

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, ...

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

你要寻找的概念是“熵”,即弦的无序程度位。从“最大熵”的概念来看,这个概念最容易理解。

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

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

所以,如果你想从两个随机样本中产生一个随机数,它是随机,将两个位字符串连接在一起。实际上,你只是将样本填充到双倍长度单词的高半部分和低半部分。

从更实际的角度来看,如果你发现自己背负着一个蹩脚的rand(),它可以有时有助于将两个样本混合在一起——尽管,如果真的是盈亏平衡的话那个程序没用。