Я сделал такой эксперимент - сделал 10 миллионов случайных чисел из C и С#. А затем подсчитали, сколько раз каждый бит из 15 бит в случайном целое установлен. (Я выбрал 15 бит, потому что C поддерживает случайное целое число только до 0x7fff
).
У меня есть это:
У меня есть два вопроса:
-
Почему существует 3 наиболее вероятных бита? В
C
наиболее вероятны биты бит8,10,12
. А также вC#
бит6,8,11
наиболее вероятны. -
Также кажется, что наиболее вероятные биты С# в основном сдвинуты на 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();
}
Очень спасибо! Btw, OS - это Windows 7, 64-битная архитектура и Visual Studio 2010.
ИЗМЕНИТЬ
Очень спасибо @David Heffernan. Здесь я сделал несколько ошибок:
- Семя в программах на C и C было другим (C использовал нуль и С# - текущее время).
- Я не пытался экспериментировать с различными значениями переменной
Times
для исследования воспроизводимости результатов.
Вот что я получил, когда проанализировал, как устанавливается вероятность того, что первый бит установлен, зависит от количества раз, когда был вызван случайный():
Так как многие заметили - результаты не воспроизводятся и не должны восприниматься всерьез.
(За исключением некоторой формы подтверждения того, что C/С# PRNG достаточно хороши:-)).