[英]Most probable bits in random integer
我做了这样的实验 - 用C和C#制作了1000万个随机数。 然后计算设置随机整数中15位的每个位的次数。 (我选择了15位,因为C支持的随机整数最多只有0x7fff
)。
我得到的是这个:
我有两个问题:
为什么有3个最可能的位? 在C
情况下,位8,10,12
是最可能的。 而在C#
位6,8,11
是最可能的。
似乎C#最可能的位大多移位2个位置,然后与C最可能位进行比较。 为什么是这样 ? 因为C#使用其他RAND_MAX常量还是什么?
C
测试代码:
void accumulateResults(int random, int bitSet[15]) { int i; int isBitSet; for (i=0; i < 15; i++) { isBitSet = ((random & (1<<i)) != 0); bitSet[i] += isBitSet; } } int main() { int i; int bitSet[15] = {0}; int times = 10000000; srand(0); for (i=0; i < times; i++) { accumulateResults(rand(), bitSet); } for (i=0; i < 15; i++) { printf("%d : %d\\n", i , bitSet[i]); } system("pause"); return 0; }
并测试C#
代码:
static void accumulateResults(int random, int[] bitSet) { int i; int isBitSet; for (i = 0; i < 15; i++) { isBitSet = ((random & (1 << i)) != 0) ? 1 : 0; bitSet[i] += isBitSet; } } static void Main(string[] args) { int i; int[] bitSet = new int[15]; int times = 10000000; Random r = new Random(); for (i = 0; i < times; i++) { accumulateResults(r.Next(), bitSet); } for (i = 0; i < 15; i++) { Console.WriteLine("{0} : {1}", i, bitSet[i]); } Console.ReadKey(); }
很感谢 !! 顺便说一句,操作系统是Windows 7,64位架构和Visual Studio 2010。
编辑
非常感谢@David Heffernan。 我在这里犯了几个错误:
Times
变量值来研究结果的可重复性。 这是我在分析设置第一位的概率取决于random()被调用的次数时得到的结果:
因此,许多人注意到 - 结果不可重复,不应该认真对待。 (除了某种形式的确认C / C#PRNG足够好:-))。
这只是普通或花园采样的变化。
想象一下,你会反复掷十次硬币的实验。 你不会期望每次都有五个头。 这取决于采样变化。
同样,您的实验将受样本变化的影响。 每个位遵循相同的统计分布。 但是采样变化意味着您不会期望在0和1之间精确地分配50/50。
现在,你的情节误导你认为变异具有某种意义或具有意义。 如果您从0开始绘制图形的Y轴,您将对此有更好的理解。该图形如下所示:
如果RNG表现得如此,那么每个比特将遵循二项分布 ,概率为0.5。 该分布具有方差np(1-p) 。 对于您的实验,这给出了250万的差异。 取平方根得到大约1,500的标准偏差。 因此,您只需从检查结果中看到,您看到的变化并不是显而易见的。 您有15个样本,没有一个超过真实均值的1.6个标准偏差。 这没什么好担心的。
您试图辨别结果的趋势。 你说有“3个最可能的位”。 这只是你对这个样本的特殊解释。 尝试使用不同种子为您的RNG再次运行程序,并且您的图表看起来会有所不同。 它们仍然具有相同的质量。 有些位设置比其他位更多。 但是没有任何可辨别的模式,当你在包含0的图形上绘制它们时,你会看到水平线。
例如,这是您的C程序为随机种子98723498734
输出的98723498734
。
我认为这应该足以说服你再进行一些试验。 当你这样做时,你会发现没有特殊的位被给予有利的治疗。
你知道偏差大约是2500 / 5,000,000,下降到0.05%?
注意,每个比特的频率差异仅变化约0.08%( - 0.03%至+ 0.05%)。 我认为我不会认为这很重要。 如果每一点都是完全相同的可能,我会发现PRNG非常值得怀疑,而不仅仅是有点可疑。 您应该期望在过程中存在一定程度的差异,这些过程应该或多或少地建模随机性......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.