3

我在使用 srand 时遇到问题。

我正在尝试在 100 到 200 之间生成一个随机数。

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

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

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

更新

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

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

每节车厢的煤量需要在1000、2000区间随机。

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

希望这更有意义。

纠结于如何实现。

4

3 回答 3

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
于 2011-10-06T07:49:15.240 回答
1

尝试这个

void srand ( unsigned int seed );

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

于 2011-10-06T07:55:25.567 回答
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);

有关更多背景信息,请参阅有关 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: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

于 2011-10-06T15:13:35.173 回答