使用带有rand()的模数限制结果?

时间:2014-07-03 13:18:22

标签: c++ random modulus

这是一个为游戏创建的程序,我在其中使用rand()尝试随机生成在结算处可以找到哪些类型的树。 rand()的种子已在main.cpp中设置为时间,因此每次都是唯一的。我的问题是关于我的模数:trees[x]=rand()%40;

如果我理解rand()如何正常工作,一旦输出它已经输出的数字,它将重复已经相同的数字序列,因为它使用公式。使用模数限制我的程序只生成40个不同的随机数序列?或者它是否继续从系统时钟中为每个以下数组绘制新的随机数?

#include <stdafx.h>
#include <iostream>
#include <cstdlib> // for rand() and srand()
#include <ctime> // for time()
using namespace std;

int forestdeterminator()
{
int trees[32];
for (int x=0; x<32; ++x)
    trees[x]=rand()%40;

    if (trees[0]>=1 && trees[0]<=9)
        cout << "Birch Trees" << endl;
    if (trees[1]>=1 && trees[1]<=3)
        cout << "Mahogany Trees" << endl;
    if (trees[2]>=1 && trees[2]<=20)
        cout << "Oak Trees" << endl;
    if (trees[3]>=1 && trees[3]<=4)
        cout << "Cherry Trees" << endl;
    if (trees[4]==1)
        cout << "Tigerwood Trees" << endl;
    if (trees[5]==1)
        cout << "Swampwood Trees (Swamp Only)" << endl;
    if (trees[6]>=1 && trees[6]<=8)
        cout << "Yew Trees" << endl;
    if (trees[7]==1)
        cout << "Petrified Trees" << endl;
    if (trees[8]>=1 && trees[8]<=24)
        cout << "Pine Trees" << endl;
    if etc etc...

3 个答案:

答案 0 :(得分:0)

没有。您只使用rand()函数的结果,因此它对PRNG的输出完全没有影响。只有当你使用rand()%40连续播种PRNG时才会遇到这个限制。

另外,请注意,PRNG通常仅在初始化时从系统时钟播种一次。从那以后,每个数字&#34;取决于&#34;在先前输出的。

最后,请注意,在PRNG的输出上使用模数几乎在所有情况下都会使得到的概率分布出现偏差。对于小模量,此效果非常非常小,但根据您的应用,可能需要考虑重要因素。

答案 1 :(得分:0)

  

使用模数限制我的程序只生成40个不同的随机数序列?

序列,值得商榷。 数字的。当然。只有40个可能的输出,您才能获得有效的随机性;那里没有足够的自由来波动。但是,不,你没有影响输出的数字,你只是严格限制你的程序的输出。

答案 2 :(得分:0)

你要做的是将32(伪)随机生成的整数从0到39放到一个名为trees的数组中。这样做并不会影响函数rand()的工作方式。无论您对之前的结果采用何种操作,它都会始终在全范围内生成数字。

所以,如果我理解你,答案是:不,在你的代码中的某个地方使用rand()%40会不会让rand()函数只生成0-39范围内的数字。