我正在使用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文件都不同。但我不希望每次需要时都手动创建它们。我想在循环中这样做。为什么这样,我该如何解决这个问题?
答案 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;
}