С++ Simple Dice roll - как вернуть несколько разных случайных чисел [дубликаты]

Я новичок в С++ и пытаюсь сделать простой бросок кубика с помощью класса Die/main.

Я могу получить случайное число в пределах моего диапазона 1-dieSize, однако каждый раз, когда я «бросаю кости», он просто дает мне одно и то же случайное число. Например, когда я бросаю этот кубик три раза, он выдает 111 или 222 и т. д. вместо 3 разных случайных бросков. Любая помощь, объясняющая эту проблему, будет высоко оценена!

Мой заголовок штампа - это просто основной заголовок. Я предполагаю, что моя проблема связана со случайной функцией.

главный:

int main()
{
// Call menu to start the program
Die myDie(4);

cout << myDie.rollDie();
cout << myDie.rollDie(); // roll dice again
cout << myDie.rollDie(); // roll again


return 0;
}

умереть.cpp:

Die::Die(int N)
{
//set dieSize to the value of int N
this->dieSize = N;
}

int Die::rollDie()
{
    // Declaration of variables
int roll;
int min = 1; // the min number a die can roll is 1
int max = this->dieSize; // the max value is the die size

unsigned seed;
seed = time(0);
srand(seed);

roll = rand() % (max - min + 1) + min;

return roll;
}

В die.cpp у меня включены cstdlib и ctime.


person Ali    schedule 16.07.2017    source источник
comment
Не звоните srand больше одного раза.   -  person melpomene    schedule 17.07.2017
comment
Поскольку вы когда-либо использовали srand с time(0) прямо перед rand, вы получите те же числа в течение одной и той же секунды. Таким образом, вы не должны каждый раз вызывать srand или использовать time(0) и last random или использовать функцию времени с более высоким разрешением,   -  person Tobias Wollgam    schedule 17.07.2017
comment
Вот еще один дубликат: stackoverflow.com/questions/1108780/   -  person user0042    schedule 17.07.2017
comment
лучший способ: xkcd.com/221   -  person sp2danny    schedule 10.04.2019


Ответы (1)


Как предложил melpomene в комментарии, вы должны инициализировать seed случайного только один раз в какой-то момент программы.

Функция rand() на самом деле не создатель случайных чисел, а скорее последовательность битовых манипуляций с ранее сгенерированным значением, которое начинается с первого значения, сгенерированного начальным числом (вызов srand(seed)).

#include <iostream>
#include <cstdlib>

int rollDie()
{
    int roll;
    int min = 1; // the min number a die can roll is 1
    int max = 6;// this->dieSize; // the max value is the die size

    roll = rand() % (max - min + 1) + min;

    return roll;
}

int main()
{
    srand(time(0));
    for(int i=0;i<10;i++)
    {
        std::cout << rollDie() << std::endl;
    }
}

Скорее всего, вы уже используете C++11, поэтому вам следует прочитать и попрактиковаться с библиотекой random: http://en.cppreference.com/w/cpp/numeric/random

person ZivS    schedule 16.07.2017