1

可能重复:
rand函数在单个函数c ++中调用时返回相同的值

为什么 rand() 生成相同的数字?

死.h

#ifndef DIE_H
#define DIE_H


class Die
{
private:
    int number;
public:
    Die(){number=0;}
    void roll();
    int getNumber()const{return number;}
    void printValue();
};

#endif

死.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;
}

主文件

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

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

3 回答 3

6

您对 to 的调用die.roll()非常接近,time(0)实际上每次都返回相同的值,因此,每次调用的 rand 种子都是相同的.roll()

尝试在外部调用srand(static_cast<int>(time(0)));一次(并且仅一次).roll()(如在 Die 构造函数中或main())。

于 2012-11-21T19:20:41.457 回答
2

您需要使用“真正随机”(或至少是唯一的)种子初始化随机生成器,并且只执行一次

这通常srand(time(NULL))在开始时完成。

生成的数字rand()不是随机的,它们是*伪*随机的:给定相同的种子,它总是会返回相同的序列。默认情况下,我相信初始种子为零(但是,在程序运行之间肯定总是相同的 - 所以如果没有种子,你每次都会得到相同的明显随机序列)。

于 2012-11-21T19:18:57.007 回答
0

正如 emartel 指出的那样,您需要的唯一真正改变是调用time(NULL)而不是time(0).

或者,您可以调用srand(time(NULL))构造函数,然后只使用rand()in roll()

于 2012-11-21T19:23:04.793 回答