Наиболее вероятные биты в случайном числе

Я провел такой эксперимент - сделал 10 миллионов случайных чисел из C и C#. А затем посчитал, сколько раз задается каждый бит из 15 бит в случайном целом числе. ( Я выбрал 15 бит, потому что C поддерживает случайное целое число только до 0x7fff).

Вот что у меня есть: enter image description here
У меня два вопроса:

  1. Почему 3 наиболее вероятных бита? В случае Cбиты 8,10,12наиболее вероятны. И в C#биты 6,8,11наиболее вероятны.

  2. Также кажется, что наиболее вероятные биты C# в основномсдвинуты на 2 позиции по сравнению с наиболее вероятными битами 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. Здесь я сделал несколько ошибок:

  1. Начальное значение в программах на C и C# было разным (C использовал ноль, а C# - текущее время).
  2. Я не пробовал экспериментировать с разными значениями переменной Timesдля исследования воспроизводимости результатов.

Вот что я получил при анализе того, как вероятность того, что будет установлен первый бит, зависит от количества вызовов random(): enter image description here
Итак, как многие заметили, результаты не воспроизводимы и не должны восприниматься всерьез. (За исключением некоторой формы подтверждения того, что C/C# PRNG достаточно хорош :-)).

10
задан Agnius Vasiliauskas 25 May 2012 в 10:34
поделиться