rand () генерирует одно и то же число

Возможный дубликат:
Функция rand возвращает те же значения при вызове внутри одной функции c ++

Почему rand () генерирует такое же число?

die.h

#ifndef DIE_H
#define DIE_Hclass Die
{
private:
int number;
public:
Die(){number=0;}
void roll();
int getNumber()const{return number;}
void printValue();
};

#endif

die.cpp

#include"die.h"#include<iostream>
#include<time.h>
using namespace std;

void Die::roll()
{
srand(static_cast<int>(time(0)));
number=1+rand()%6;
}

void Die::printValue()
{
cout<<number<<endl;
}

main.cpp

#include"die.h"#include<iostream>
using namespace std;

int main()
{
Die d;
d.roll();
d.printValue();
d.roll();
d.printValue();
d.roll();
d.printValue();
}

1

Решение

Ваши звонки на die.roll() так близко, что time(0) на самом деле каждый раз возвращает одно и то же значение, и, таким образом, ваше рандовое семя одинаково для каждого вызова .roll(),

Попробуйте позвонить srand(static_cast<int>(time(0))); один раз (и только один раз) за пределами .roll() (как в конструкторе Die или main()).

6

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

Вам нужно инициализировать генератор случайных чисел с помощью «действительно случайного» (или хотя бы уникального) начального числа и сделать это. только однажды.

Обычно это делается с srand(time(NULL)) в начале.

Числа, сгенерированные rand() не случайны, они * псевдо * случайны: при одинаковом начальном значении всегда будет возвращаться одна и та же последовательность. По умолчанию, я считаю, что начальное начальное число равно нулю (однако, оно наверняка всегда одинаково между запусками программы — поэтому без заполнения вы всегда будете получать одинаковую случайную последовательность каждый раз).

2

Как отметил Emartel, единственное реальное изменение, которое вам нужно, это позвонить time(NULL) вместо time(0),

Вы также можете позвонить srand(time(NULL)) в конструкторе, а затем просто использовать rand() в roll(),

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector