我无法理解这个,哪个更随机?
rand()
OR:
rand() * rand()
我发现这是一个真正的脑筋急转弯,你能帮我吗?
编辑:
直觉上,我知道数学上的答案是它们是同样随机的,但我不禁想,如果你在将两者相乘时“运行随机数算法”两次,你会创建比只做一次更随机的东西。
我无法理解这个,哪个更随机?
rand()
OR:
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结果。
没有比这更随机的了。它要么是随机的,要么不是随机的。随机意味着“难以预测”。这并不意味着不确定性。如果random()是随机的,那么random(()和random(*random)都是随机的。就随机性而言,分布是无关紧要的。如果出现不均匀分布,则意味着某些值比其他值更有可能;它们仍然是不可预测的。由于涉及伪随机性,所以这些数字非常具有确定性。然而,在概率模型和模拟中,伪随机性通常是足够的。众所周知,使伪随机数生成器复杂化只会使其难以分析。不太可能提高随机性;它经常导致它无法通过统计测试。随机数的期望财产很重要:重复性和再现性、统计随机性、(通常)均匀分布和大周期是少数几个。关于随机数上的变换:正如有人所说,两个或多个均匀分布的和产生正态分布。这是加法中心极限定理。无论源分布如何,只要所有分布都是独立和相同的,它都适用。乘性中心极限定理表示两个或多个独立且一致分布的随机变量的乘积是对数正态的。其他人创建的图形看起来是指数型的,但实际上是对数正态的。因此random()*random(()是对数正态分布的(尽管它可能不是独立的,因为数字是从同一个流中提取的)。这在某些应用中可能是期望的。然而,通常最好生成一个随机数并将其转换为对数正态分布数。Random()*Random()可能很难分析。
欲了解更多信息,请访问www.performorama.org查阅我的书。这本书正在建设中,但相关材料已经存在。请注意,章节和章节编号可能会随时间而变化。第8章(概率论)——第8.3.1和8.3.3节,第10章(随机数)。
根据您的计算机体系结构,相乘数字最终会得到更小的解决方案范围。
如果您的计算机显示16位数字,rand()将为0.1234567890123乘以第二个rand(),0.1234567890123,将得到0.0152415如果你把实验重复10^14次,你肯定会找到更少的解决方案。
假设你有一个简单的硬币翻转问题,偶数被认为是正面,奇数被认为是反面。逻辑实现是:
rand() mod 2
在足够大的分布范围内,偶数的数量应该等于奇数的数量。
现在考虑一个小小的调整:
rand() * rand() mod 2
如果其中一个结果是偶数,那么整个结果应该是偶数。考虑4种可能的结果(偶*偶=偶,偶*奇=偶,奇*偶=偶数,奇*奇=奇数)。现在,在足够大的分布范围内,答案应该是75%的时间。
如果我是你,我敢打赌。
这条评论实际上更多的是解释为什么不应该基于您的方法实现自定义随机函数,而不是讨论随机性的数学财产。