2012-11-30 83 views
1

我使用的是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 

等等,那么一切都OK - 所有* .in文件是不同的。但我不想在每次需要时都手动创建它们。我想循环做这件事。为什么是这样,我该如何解决这个问题?

回答

4

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

一个sleep应该做的伎俩,是这样的:

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

太感谢你了! :-) – xan

2

这是因为,当你播种从time()随机数(秒整数) - 如果在多次运行程序同样的秒钟你会得到相同的结果。

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

请注意,如果你只是想生成一个随机数列表&你在linux上的设备/dev/urandom(非阻塞)或/dev/random(阻塞)将做的伎俩。

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; 
}