生成随机数 - srand c ++

时间:2011-10-06 07:45:08

标签: c++ random srand

我在使用srand时遇到了麻烦。

我想在100到200区间内生成一个随机数。

该数字将继续生成并放入数组中。一旦再次调用该方法,就需要再次生成相同的随机数序列。

因此,我需要种子,无论我尝试什么,我似乎无法让它发挥作用。

我不是在寻找任何人编写代码而只是向我展示生成此类数字的正确格式。

更新

我有一个火车对象,其中包含一个链表(有线列表中的每个位置都是一个滑架)。

每列火车中的车厢数量需要在100,200区间内随机。

每个车厢中的煤量需要在区间1000,2000中随机。

我正在尝试实施一个模拟器类,它将创建一个随机数量的车厢,其中包含随机数量的数据。

希望更有意义。

苦苦思索如何实施它。

3 个答案:

答案 0 :(得分:2)

如果您只想重复一个任意序列,可以通过给它设置相同的参数来设置种子srand()

例如:

pax$ cat qq.c
#include <iostream>
#include <cstdlib>

int main (void) {
    srand (42);
    for (int i = 0; i < 5; i++) {
        int x = 100 + (rand() % 101);
        std::cout << x << std::endl;
    }
    std::cout << "=====" << std::endl;
    srand (42);
    for (int i = 0; i < 5; i++) {
        int x = 100 + (rand() % 101);
        std::cout << x << std::endl;
    }
    return 0;
}

pax$ g++ -o qq qq.cpp ; ./qq
163
166
148
137
149
=====
163
166
148
137
149

答案 1 :(得分:1)

试试这个

void srand ( unsigned int seed );

如果seed设置为1,则将生成器重新初始化为其初始值,并生成与调用rand或srand之前相同的值。

答案 2 :(得分:1)

如上所述,您可以使用同一种子不止一次播种。

srand(1234); // magic number

// .... 

srand(1234); // magic number again

rand()的输出将从之前的相同位置重新开始。

当你在它时,我建议不要在rand()上使用模运算符,因为它不会导致值的均匀分布。相反,您可以使用以下帮助程序获取整数范围内的随机值:

int randRange(int M, int N)
{
     // see http://eternallyconfuzzled.com/arts/jsw_art_rand.aspx
     return M + rand() / ( RAND_MAX / ( N - M ) + 1 );
}

int nextrand = randRange(100,200);

请参阅链接的article on Eternally Confuzzled(由Julienne Walker提供)以获取更多背景信息,同时参阅播种

C ++选项

以上缺点是生成完全是顺序的(您不能同时拥有两个随机生成器实例)。由于您使用C ++进行标记,为什么我们不使用它呢!

您可以使用tr1或c ++ 0x / c ++ 11 1 uniform_int_distribution

#include <random>
#include <functional>

std::uniform_int_distribution<int> distribution(100, 200);
std::mt19937 engine; // Mersenne twister MT19937

int nextrand  = distribution(engine);

一个直接的优势是您可以让多个引擎同时生成相同的序列(参见示例)。

正如您所看到的,您可以像engine(1234)一样为srand播种生成器。 现场观看样本:

  • C ++ 03 with boost: https://ideone.com/FC4xm

    #include <boost/random.hpp>
    #include <boost/random/uniform_int.hpp>
    
    int main()
    {
        boost::mt19937 engine1(1234);
        boost::mt19937 engine2(1234);
        boost::uniform_int<> dist(100,200);
    
        for (int i=0; i<20; i++)
        {
             std::cout << dist(engine1) << " is equal to " << dist(engine2) << std::endl;
        }
    }
    
         

  • C ++ 0x http://ideone.com/467Aj
    还展示了一点语法糖:

    auto generator = std::bind(distribution, engine);
    nextrand = generator(); // more convenient use
    
         

1 Boost.Random如果使用C ++ 03