@mardokvk
Я junior-программист, мой профиль С#, изучаю С++.

Как получить случайные числа в C++?

offer rand_offer()
{
	milliseconds ms = duration_cast<milliseconds>(system_clock::now().time_since_epoch());
	unsigned __int64 count_ms = ms.count();
	Sleep(1);
	srand(count_ms);
	double price = (rand() % 10) + ((double)rand() / 100);
	int count = rand() % 1000;
	return { price,count };
}


Вот метод который генерирует нужные мне числа. Как вы можете заметить я использую функцию rand()
Функция работает слишком быстро из-за чего без Sleep(1) все числа полученные от этой функции одинаковые
Подскажите пожалуйста как генерировать случайные числа. Какие методы есть? Это просто одна из моих попыток сделать хоть что-нибудь.

В общем то я просто генерирую тестовые данные для своей программы. И не знаю как сделать чтобы числа всегда были случайные. Заранее спасибо.
  • Вопрос задан
  • 242 просмотра
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
srand вызывайте только один раз где-нибудь в начале программы. А потом сколько угодно раз используйте rand.

srand устанавливает состояние генератора псевдослучайных чисел. В качестве seed вы там используете количество миллисекунд, которое целую миллисекунду одинаковое, поэтому состояние генератора у вас в каждой функции rand_offer одно и то же - поэтому числа и генерируются одни и теже. sleep(1) лечит проблему потому, что следующий вызов посчитает другое значение count_ms.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
mayton2019
@mayton2019
Bigdata Engineer
Получение по настоящему случайных чисел - это криптографическая задача и ее делают через всякие
библиотеки типа OpenSSL
и прочие. Там есть API для криптостойких ГПСЧ. Вы можете вызывать их
без сидирования между вызовами поскольку там эта проблема уже решена.

Если вы уже добрались до работы с системными часами
system_clock::now()
то означает что у вас есть какие-то мысли по поводу ГПСЧ или вы видите недостатки просто
вызова rand() - то расскажите какие именно. Или где вы внутри rand увидели дефект.
Обычно 99% пользователей довольны rand и име ничего другого не надо.

В вашем коде srand(..) нужно вызвать 1 единственный раз и потом просто брать значения из rand(..)
Ответ написан
Комментировать
@vanyamba-electronics
На другом компьютере набор чисел будет другим.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы