我无法理解这个,哪个更随机?
rand()
OR:
rand() * rand()
我发现这是一个真正的脑筋急转弯,你能帮我吗?
编辑:
直觉上,我知道数学上的答案是它们是同样随机的,但我不禁想,如果你在将两者相乘时“运行随机数算法”两次,你会创建比只做一次更随机的东西。
我无法理解这个,哪个更随机?
rand()
OR:
rand() * rand()
我发现这是一个真正的脑筋急转弯,你能帮我吗?
编辑:
直觉上,我知道数学上的答案是它们是同样随机的,但我不禁想,如果你在将两者相乘时“运行随机数算法”两次,你会创建比只做一次更随机的东西。
当前回答
正如其他人已经指出的那样,这个问题很难回答,因为我们每个人的大脑中都有自己的随机性图景。
这就是为什么,我强烈建议您花一些时间阅读本网站,以更好地了解随机性:
http://www.random.org/
回到真正的问题。在这个术语中没有或多或少的随机性:
两者都只是随机出现的!
在这两种情况下-仅rand()或rand(*rand)-情况相同:在几十亿个数字之后,序列将重复(!)。对观察者来说,它似乎是随机的,因为他不知道整个序列,但计算机没有真正的随机源,所以他也不能产生随机性。
天气是随机的吗?我们没有足够的传感器或知识来确定天气是否随机。
其他回答
关于“随机性”的一些事情是反直觉的。
假设rand()的平面分布,下面将得到非平面分布:
高偏差:sqrt(rand(范围^2))中间偏差峰值:(rand(range)+rand(range))/2低:偏差:范围-sqrt(rand(范围^2))
有很多其他方法可以创建特定的偏置曲线。我对rand()*rand(()做了一个快速测试,它得到了一个非常非线性的分布。
假设你有一个简单的硬币翻转问题,偶数被认为是正面,奇数被认为是反面。逻辑实现是:
rand() mod 2
在足够大的分布范围内,偶数的数量应该等于奇数的数量。
现在考虑一个小小的调整:
rand() * rand() mod 2
如果其中一个结果是偶数,那么整个结果应该是偶数。考虑4种可能的结果(偶*偶=偶,偶*奇=偶,奇*偶=偶数,奇*奇=奇数)。现在,在足够大的分布范围内,答案应该是75%的时间。
如果我是你,我敢打赌。
这条评论实际上更多的是解释为什么不应该基于您的方法实现自定义随机函数,而不是讨论随机性的数学财产。
好的,所以我会尝试添加一些值来补充其他答案,说你正在创建和使用一个随机数生成器。
随机数发生器是一种具有多种特性的设备(从非常普遍的意义上讲),可以根据需要进行修改。其中一些(来自我)是:
熵:如香农熵分布:统计分布(泊松、正态等)类型:数字的来源(算法、自然事件、组合等)和应用的算法。效率:执行的速度或复杂性。模式:周期、顺序、运行等。也许还有更多。。。
在这里的大多数答案中,分布是主要的关注点,但通过混合和匹配函数和参数,您可以创建生成随机数的新方法,这些随机数将具有不同的特征,其中一些特征乍一看可能不明显。
假设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”>正在生成图表</分区>
根据您的计算机体系结构,相乘数字最终会得到更小的解决方案范围。
如果您的计算机显示16位数字,rand()将为0.1234567890123乘以第二个rand(),0.1234567890123,将得到0.0152415如果你把实验重复10^14次,你肯定会找到更少的解决方案。