Произведите случайное семя, чтобы дать srand () — Не время (NULL)

Я сейчас пишу программу генерации уровней для игры Sokoban. Я довольно часто использую функцию rand () для генерации каждого уровня, и я подумал, что для пользователя будет удобной возможность управлять семенем, используемым для генерации, а это означает, что два человека могут ввести одно семя и Генератор будет генерировать те же уровни.

Я использую

srand(std::time(NULL));

чтобы получить семя, которое работает нормально, и моя программа сгенерирует те же уровни с тем же семенем без проблем. Однако, поскольку std :: time (NULL) возвращает системное время в миллисекундах, оно не дает очень интересных или разнородных чисел, т. Е. Оно выдаст 1476894985, и тогда следующее начальное число может быть 1476897904.

Чтобы получить более интересные начальные значения, я попытался создать случайное начальное число в диапазоне от 0 до 9999999999, используя следующий код:

typedef unsigned long long ull;

SokoGenerator::ull SokoGenerator::randomNumber(ull min, ull max, int divisor){
ull number = rand() % (max - min + 1)+ min;

while(number % divisor != 0){
number = rand() % (max - min + 1) + min;
}

return number;
}srand(std::time(0));
genSeed = randomNumber(0, 999999999); }
srand(genSeed);
//Generate Levels After this point

Но, похоже, это дает схожие результаты, за исключением того, что теперь они намного меньше, т.е. 45789, 46389, 47958.

Есть ли лучший способ создать хорошее случайное начальное число в диапазоне от 0 до 9999999999 для функции srand ()?

-1

Решение

В итоге я использовал генератор случайных чисел C ++ 11 Uniform Distribution, чтобы получить значение от 0 до 4 294 967 295, вот так:

std::default_random_engine generator;
std::uniform_int_distribution<int> distribution;
generator.seed(chrono::steady_clock::now().time_since_epoch().count());
random = distribution(generator);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]