Это вопрос о вопросе 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
Мой вопрос (ы) является:
- Я интерпретирую результаты для 8 бит беспорядочно правильно, а именно, учитывая, что один из тестов (который был отмечен как «хороший», для записи он также вернулся как слабый для одного из отмеченных тестов «подозреваемый»), оказался слабым, а один - неудачным, случайность ранда() должна быть заподозрена.
- Я правильно интерпретирую результаты для тестируемого алгоритма (а именно, что это также должно быть незначительно заподозрено)
- С учетом описания того, что тесты, которые вернулись как слабые (например, для sts_serial рассматривает вопрос о том, битовые шаблоны определенного размера), должен ли я определить, что может быть смещением
- Если 3, так как я не знаю, может кто-то указать, что я должен видеть?
Редактировать: поняли, что rand() не гарантированно будет большим. Кроме того, я попытался подумать, какие значения будут менее вероятными, и предположил бы нуль, maxvalue или повторные числа, возможно ... но выполнив проверку 1000000000 попыток, отношение очень близко к ожидаемому значению 1 из каждых 2^15 раз (например, в 1000000000 пробегов мы видели 30512 нулей, 30444 макс и 30301 повторений, а bc говорит, что 30512 * 2^15 - 999817216, другие прогоны имеют одинаковые отношения, включая случаи, когда max и/или повторение больше, чем нули .
Проблема с просто вызовом 'rand()' является то, что даже если 'RAND_MAX == INT_MAX', он возвращает неотрицательный подписанный int, поэтому MSB всегда равен нулю (обычно 31 случайный бит). – nwellnhof
Также обратите внимание, что качество чисел, возвращаемых 'rand()', просто зависит от реализации в соответствующей библиотеке C. Всегда есть компромиссы между качеством, скоростью и использованием памяти. Говорят, что CRT от Microsoft имеет особенно плохую реализацию. Если вам нужны качественные случайные числа, не полагайтесь на 'rand()'. – nwellnhof