生成随机测试

时间:2012-11-30 22:20:16

标签: c++ bash

我正在使用ubuntu 10.10,我想用几个随机测试来测试我的C ++程序,所以我想生成它们。我写了发电机:

// gen.cpp
#include <iostream>
#include <cstdio>
#include <ctime>
#include <cstdlib>

using namespace std;

int main() {
  srand(time(NULL));
  int n=rand()%100;
  int k=rand()%n+1; 

  printf("%d %d\n", n,k);
  for(int i=0; i<n; i++) {
    int a = rand()%100;
    printf("%d\n", a);
  } 

  return 0;
}

然后键入终端:

for((i=0; i<10; i++)); do ./gen > $i.in; done

但结果是所有* .in文件都包含相同的数字。当我输入:

./gen > 0.in
./gen > 1.in

依此类推,然后一切正常 - 所有* .in文件都不同。但我不希望每次需要时都手动创建它们。我想在循环中这样做。为什么这样,我该如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

您需要在bash循环中加一个延迟,以便每次都不使用相同的种子。因为你使用time()作为种子,所以在同一秒内的所有执行都会给你相同的序列。

sleep应该可以做到这一点,例如:

for((i=0; i<10; i++)); do ./gen > $i.in; sleep 2; done

答案 1 :(得分:2)

这是因为当您从time()(整数秒)播种随机数时 - 如果您在同一秒内多次运行该程序,您将获得相同的结果。

如果你想要不同的数字,你应该使用不同的种子。

请注意,如果您只想生成随机数列表&amp;你在linux上的设备/dev/urandom(非阻塞)或/dev/random(阻塞)就可以了。

答案 2 :(得分:1)

使用新的更高质量的C ++ 11版本更改旧C随机数生成器的使用情况:

// gen.cpp
#include <iostream>
#include <cstdio>
#include <random>

using namespace std;

int main() {
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis;

    int n = dis(gen) %100;
    int k = dis(gen) % n + 1;

    printf("%d %d\n", n, k);
    for (int i = 0; i != n; ++i)
    {
        int a = dis(gen) % 100;
        printf("%d\n", a);
    }

    return 0;
}