2013-04-09 90 views
2

我想生成一个0到100 000之间的10000整数的文件,这样我可以稍后对它们进行MergeSort。无法为整数生成全范围的随机数

当我生成使用fstream的文件,我永远无法32760.

以下方法生成该文件的整数,并且然后读回,并检查用于通过32750.任何整数I一般为3-5之间得到32750和32760之间的整数。为什么会发生这种情况,我该如何解决?它是种子问题还是Random函数的实际使用?

// sizeOfArray = 10000 
void generateFile() { 
    ofstream fout("unsorted.txt"); 
    srand(time(NULL)); 

    // Generating the file 
    int num; 
    for(int i = 0; i < sizeOfArray; i++) { 
     num = rand() % 100000; 
     if(i < sizeOfArray-1) 
      //fout << i+1 << ": " << num << endl; 
      fout << num << endl; 
     else 
      //fout << i+1 << ": " << num; 
      fout << num; 
    } 

    // Reading the File Back 
    ifstream fin("unsorted.txt"); 
    for(int i = 0; i < sizeOfArray; i++) { 
     fin >> num; 
     if(num > 32750) 
      cout << num << endl; 
    } 

    cin.get(); 
} 

解决
使用回答下面提供我所生成的文件500倍
和我收到的最大整数为99931.

+1

这就是随机数发生器的范围。使用不同的随机数发生器,或者采用两个随机数并将它们合并为一个。 – 2013-04-09 18:00:16

+2

根据cplusplus.com,rand()的范围是'0 - RAND_MAX'。 'RAND_MAX'是依赖于库的,但应该至少为'32767'。 – OGH 2013-04-09 18:01:31

+0

你知道一个随机数字发生器,可以给我所需的范围吗? – Gander7 2013-04-09 18:01:33

回答

7

,你可以从rand()得到最高的随机值是RAND_MAX ,一个依赖库的常量。在你的情况,它似乎设置为2^15-1,最高的正数,符合一个有符号的16位整数。

当您需要生成大于RAND_MAX的数字时,请拨打rand()几次,每次乘以RAND_MAX。例如,在你的情况下,下面的代码应该工作(我假设你int有32位):

num = rand(); 
num *= RAND_MAX; 
num += rand(); 
num %= 100000; 

注意,仅仅是添加三个随机数字加在一起,以获得所需范围内不会产生相同的随机分布作为乘法和加法的方法。

+0

为什么包含行num + = rand()?我试了一下,没有看到这行,仍然收到了非常接近100 000的整数。 – Gander7 2013-04-09 18:37:04

+1

@ Gander7:如果你不做'num + = rand()',你的结果(modding之前)总是“ RAND_MAX'。你也可以这样想:如果'RAND_MAX'是2的幂,它就相当于做左移位和OR来分别设置比特段。 – jamesdlin 2013-04-09 18:39:09

+1

啊,即使rand()已经使用过一次,没有这一行,我仍然只能得到32767个数字。它们将是原来的32767 * RAND_MAX。第二个Rand()是为了使结果多样化。 @ jamesdlin谢谢。 – Gander7 2013-04-09 18:42:18

2

取决于你使用的是什么:​​