rand()生成相同的数字

时间:2012-11-21 19:17:55

标签: c++ visual-c++

  

可能重复:
  rand function returns same values when called within a single function c++

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

die.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

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();
}

3 个答案:

答案 0 :(得分:6)

您对die.roll()的呼叫非常接近,time(0)实际上每次都返回相同的值,因此,每次拨打.roll()时,您的rand种子都是相同的。

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

答案 1 :(得分:2)

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

这通常在开始时使用srand(time(NULL))

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

答案 2 :(得分:0)

正如emartel所指出的,唯一真正的变化就是致电time(NULL)而不是time(0)

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