随机整数中最可能的位

Agn*_*kas 10 c c# random

我做了这样的实验 - 用C和C#制作了1000万个随机数.然后计算设置随机整数中15位的每个位的次数.(我选择了15位,因为C仅支持随机整数0x7fff).

我得到的是这个: 在此输入图像描述
我有两个问题:

  1. 为什么有3个最可能的位?在C案件位8,10,12是最有可能的.最有可能是C#比特6,8,11.

  2. 似乎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;
}
Run Code Online (Sandbox Code Playgroud)

测试代码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();
}
Run Code Online (Sandbox Code Playgroud)

很感谢 !!顺便说一句,操作系统是Windows 7,64 位架构和Visual Studio 2010.

编辑
非常感谢@David Heffernan.我在这里犯了几个错误:

  1. C和C#程序中的种子不同(C使用零和C# - 当前时间).
  2. 我没有尝试使用不同的Times变量值来研究结果的可重复性.

这是我在分析设置第一位的概率取决于random()被调用的次数时得到的结果: 在此输入图像描述
因此,许多人注意到 - 结果不可重复,不应该认真对待.(除了某种形式的确认C/C#PRNG足够好:-)).

Dav*_*nan 10

这只是普通或花园采样的变化.

想象一下,你会反复掷十次硬币的实验.你不会期望每次都有五个头.这取决于采样变化.

同样,您的实验将受样本变化的影响.每个位遵循相同的统计分布.但是采样变化意味着您不会期望在0和1之间精确地分配50/50.

现在,你的情节误导你认为变异具有某种意义或具有意义.如果您从0开始绘制图形的Y轴,您将对此有更好的理解.该图形如下所示:

在此输入图像描述

如果RNG表现得如此,那么每个比特将遵循二项分布,概率为0.5.该分布具有方差np(1-p).对于您的实验,这给出了250万的差异.取平方根得到大约1,500的标准偏差.因此,您只需从检查结果中看到,您看到的变化并不是显而易见的.您有15个样本,没有一个超过真实均值的1.6个标准偏差.这没什么好担心的.

您试图辨别结果的趋势.你说有"3个最可能的位".这只是你对这个样本的特殊解释.尝试使用不同种子为您的RNG再次运行程序,并且您的图表看起来会有所不同.它们仍然具有相同的质量.有些位设置比其他位更多.但是没有任何可辨别的模式,当你在包含0的图形上绘制它们时,你会看到水平线.

例如,这是您的C程序为随机种子输出的内容98723498734.

在此输入图像描述

我认为这应该足以说服你再进行一些试验.当你这样做时,你会发现没有特殊的位被给予有利的治疗.