2015-03-31 3 views
1

Это вопрос о вопросе SO; Я не думаю, что он принадлежит мета, несмотря на то, что он по определению, но если кто-то чувствует, что он должен перейти к математике, перекрестной проверке и т. Д., Пожалуйста, дайте мне знать.Как интерпретировать результаты от великого правосудия для великого правосудия

Справочная информация: @ForceBru задала этот вопрос question о том, как сгенерировать 64-битное случайное число, используя rand(). @nwellnhof предоставил ответ, который был принят, который в основном принимает низкие 15 бит из 5 случайных чисел (поскольку MAXRAND, по-видимому, гарантированно будет только 15 бит на, по крайней мере, некоторых компиляторах) и склеивает их вместе, а затем удаляет первые 11 бит (15 * 5 -64 = 11). @NikBougalis сделал комментарий, что, хотя это кажется разумным, он не пройдет много статистических тестов randomnes. @Foon (я) попросил цитату или пример теста, что он потерпит неудачу. @NikBougalis ответил с ответом, который не разъяснил мне; @DavidSwartz предложил запустить его против dieharder.

Итак, я побежал в тюрьму. Я побежал против алгоритма в вопросе

unsigned long long llrand() { 
    unsigned long long r = 0; 

    for (int i = 0; i < 5; ++i) { 
     r = (r << 15) | (rand() & 0x7FFF); 
    } 

    return r & 0xFFFFFFFFFFFFFFFFULL; 
} 

Для сравнения, я побежал против только рандов() и только 8bits из RAND() в момент времени.

void rand_test() 
{ 
int x; 
srand(1); 
    while(1) 
    { 
     x = rand(); 
     fwrite(&x,sizeof(x),1,stdout); 
    } 

void rand_byte_test() 
{ 
    srand(1); 
    while(1) 
    { 
     x = rand(); 
     c = x % 256; 
     fwrite(&c,sizeof(c),1,stdout); 
    } 
} 

Алгоритм под вопросом вернулся с двух тестов, показывая weakenesses для rgb_lagged_sum для ntuple = 28 и один из sts_serials для ntuple = 8.

Простое использование rand() неудачно на многих тестах, по-видимому, потому, что я беру число, которое имеет 15 бит случайности и передает его как 32 бит случайности.

используя младшие 8 бит рандов() в то время, вернулся слабым для rgb_lagged_sum с ntuple 2, и (редактировать) не dab_monobit с кортежем 12

Мой вопрос (ы) является:

  1. Я интерпретирую результаты для 8 бит беспорядочно правильно, а именно, учитывая, что один из тестов (который был отмечен как «хороший», для записи он также вернулся как слабый для одного из отмеченных тестов «подозреваемый»), оказался слабым, а один - неудачным, случайность ранда() должна быть заподозрена.
  2. Я правильно интерпретирую результаты для тестируемого алгоритма (а именно, что это также должно быть незначительно заподозрено)
  3. С учетом описания того, что тесты, которые вернулись как слабые (например, для sts_serial рассматривает вопрос о том, битовые шаблоны определенного размера), должен ли я определить, что может быть смещением
  4. Если 3, так как я не знаю, может кто-то указать, что я должен видеть?

Редактировать: поняли, что rand() не гарантированно будет большим. Кроме того, я попытался подумать, какие значения будут менее вероятными, и предположил бы нуль, maxvalue или повторные числа, возможно ... но выполнив проверку 1000000000 попыток, отношение очень близко к ожидаемому значению 1 из каждых 2^15 раз (например, в 1000000000 пробегов мы видели 30512 нулей, 30444 макс и 30301 повторений, а bc говорит, что 30512 * 2^15 - 999817216, другие прогоны имеют одинаковые отношения, включая случаи, когда max и/или повторение больше, чем нули .

+0

Проблема с просто вызовом 'rand()' является то, что даже если 'RAND_MAX == INT_MAX', он возвращает неотрицательный подписанный int, поэтому MSB всегда равен нулю (обычно 31 случайный бит). – nwellnhof

+0

Также обратите внимание, что качество чисел, возвращаемых 'rand()', просто зависит от реализации в соответствующей библиотеке C. Всегда есть компромиссы между качеством, скоростью и использованием памяти. Говорят, что CRT от Microsoft имеет особенно плохую реализацию. Если вам нужны качественные случайные числа, не полагайтесь на 'rand()'. – nwellnhof

ответ

3

При запуске dieharder колонки вам действительно нужно смотреть это столбец значение р

столбец р-значение, по существу, говорит: «. Это вероятность того, что реальные случайные числа могли произвести этот результат.«Вы хотите, чтобы он был равномерно распределен между 0 и 1.

Вы также захотите запустить его несколько раз в подозрительных случаях. Например, если у вас есть столбец с p-значением (например). 03, то, если вы повторно запустили его, у вас все еще есть .03 (а не какое-то более высокое значение), тогда вы можете быть уверены, что ваш генератор случайных чисел плохо работает на этом тесте, и это не просто 3% случайность. вы получаете большую ценность, тогда вы, вероятно, смотрите на статистическую случайность. Но это сокращается в обоих направлениях.

В конечном счете, знание фактов о случайных или псевдослучайных процессах затруднено. Но вооруженный умником, у вас есть приблизительное знание многих вещей .

Смежные вопросы