2014-02-25 63 views
-1

每当我在我的类文件中调用一个特定的方法时,我会返回一个随机值,但是它会在每次再次调用该方法时返回相同的值。兰德()每次函数调用返回相同的值

例如

int CommuterTrain::getRandNumber(int maximumValue) 
{ 
    srand(unsigned(time(NULL))); 

    int maximum = maximumValue; 
    return rand()%maximum+1; 
} 

void CommuterTrain::loadRiders() 
{ 
    int passengers = getRandNumber(350); 
    currentRiders += passengers; 
    if (currentRiders > maxCapacity) { 
     cout << "The train has reached capacity! \nSome people were left at the station." 
       << endl; 
     currentRiders = maxCapacity; 
    } 
    else { 
     cout<<passengers<<" pax have entered the vessel"<<endl; 
    } 
} 

假设发电机产生数215人以上成行。当我再次调用该方法时,它不会再次随机化,每次都以215结束。

问题在发生器中,还是在下面的方法?

+7

只给发生器播种一次 – paulm

+1

为什么每次都播种兰特?在程序启动时你应该这样做。 – Linuxios

+1

Soooooooooooooooo许多重复... –

回答

1

您继续重新播种。使用相同的种子(假设你有一台比1920年更新的计算机,因此可以在第二个&匕首;下执行你的代码)。不要这样做。

这意味着你不断重新生成并且一次又一次地重新启动相同的伪随机序列。因此,每次调用rand()时,都会按照该顺序继续提取相同的第一个值。

种子只有一次在您的程序中。

例如,您可以将srand调用放入main

&dagger;只要你刚开始执行,就可能需要一秒左右的时间,就像新的一秒开始。整数逻辑和所有。随你。

0

你的问题是,你播种随机引擎每次调用你的函数:

int CommuterTrain::getRandNumber(int maximumValue) 
{ 
    srand(unsigned(time(NULL))); // <<< This line causes your problems 

    int maximum = maximumValue; 
    return rand()%maximum+1; 
} 

目前time()结果是不太可能在调用该函数getRandNumber()之间显著变化。

你应该叫srand(time(NULL))一次您的函数,而不是(例如在您CommuterTrain类的构造函数,或只从main()甚至更​​好)。

相关问题