Ответ 1
Вам нужно "засеять" генератор. Посмотрите это короткое видео, оно прояснит ситуацию.
В этом довольно базовом фрагменте кода на С++, включающем генерацию случайных чисел:
include <iostream>
using namespace std;
int main() {
cout << (rand() % 100);
return 0;
}
Почему я всегда получаю вывод из 41? Я пытаюсь получить его для вывода случайного числа от 0 до 100. Может быть, я не понимаю, как работает функция rand?
Вам нужно "засеять" генератор. Посмотрите это короткое видео, оно прояснит ситуацию.
Вам нужно изменить seed.
int main() {
srand(time(NULL));
cout << (rand() % 101);
return 0;
}
Значение для посева srand
истинно также для кода языка c
.
См. также: http://xkcd.com/221/
Для чего стоит вы также генерируете числа от 0 до 99 (включительно). Если вы хотите генерировать значения от 0 до 100, вам понадобится.
rand() % 101
в дополнение к вызову srand(), как упоминалось другими.
Вы не посеяли номер.
Используйте это:
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
srand(static_cast<unsigned int>(time(0)));
cout << (rand() % 100) << endl;
return 0;
}
Вам нужно всего лишь семять его. В основном не засевают его каждое случайное число.
srand()
помещает генератор случайных чисел. Без семян генератор не может генерировать числа, которые вы ищете. До тех пор, пока необходимость в случайных числах не является критичной для безопасности (например, любой криптографией), обычной практикой является использование системного времени в качестве семени с использованием функции time()
из библиотеки <ctime>
как таковой: srand(time(0))
. Это запустит генератор случайных чисел с системным временем, обозначенным как временная метка Unix (т.е. Количество секунд с даты 1/1/1970). Затем вы можете использовать rand()
для генерации псевдослучайного числа.
Вот цитата из повторяющегося вопроса:
Причина в том, что случайное число, генерируемое функцией rand(), не является фактически случайным. Это просто трансформация. Википедия дает лучшее объяснение значения генератора псевдослучайных чисел: детерминированный генератор случайных бит. Каждый раз, когда вы вызываете rand(), он принимает семя и/или последнее случайное число сгенерировано (стандарт C не указывает алгоритм используется, хотя С++ 11 имеет возможности для определения некоторых популярных алгоритмов), работает математическая операция над этими числами и возвращает результат. Поэтому, если состояние семени одинаково каждый раз (так, как если бы вы не вызывали srand с поистине случайное число), тогда вы всегда будете получать одинаковые "случайные" номера.
Если вы хотите узнать больше, вы можете прочитать следующее:
http://www.dreamincode.net/forums/topic/24225-random-number-generation-102/
http://www.dreamincode.net/forums/topic/29294-making-pseudo-random-number-generators-more-random/
случайные функции, такие как borland complier
using namespace std;
int sys_random(int min, int max) {
return (rand() % (max - min+1) + min);
}
void sys_randomize() {
srand(time(0));
}