无法为整数生成全范围的随机
Can't Generate Full Range of Random for Integers
我正在尝试生成一个0到100,000之间的10000个整数的文件,以便我可以稍后对它们进行合并排序。
当我使用fstream生成文件时,我从来没有得到一个超过32760的整数。
下面的方法生成文件,然后将其读回并检查是否有大于32750的整数。我通常会得到32750到32760之间的3-5个整数。为什么会发生这种情况,我该如何解决它?这是一个种子问题还是随机函数的实际使用?
// 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
您可以从rand()
获得的最高随机值是RAND_MAX
,一个库相关常数。在您的情况下,它似乎被设置为2^15-1
,这是适合于有符号16位整数的最大正数。
当需要生成大于RAND_MAX
的数字时,多次调用rand()
,每次乘以RAND_MAX
。例如,在您的情况下,下面的代码应该工作(我假设您的int
有32位):
num = rand();
num *= RAND_MAX;
num += rand();
num %= 100000;
请注意,仅仅将三个随机数加在一起以获得所需的范围将不会产生与乘法和加法方法相同的随机分布。
您可以使用c++ 11中引入的新随机数生成器之一来获得更大的范围:http://en.cppreference.com/w/cpp/numeric/random
如果你没有c++ 11,你也可以从Boost: http://www.boost.org/doc/libs/1_53_0/doc/html/boost_random.html
取决于您使用的是什么:http://www.cplusplus.com/reference/cstdlib/RAND_MAX/
相关文章:
- 如何使用按位运算将随机uint64_t转换为范围 (0, 1) 的随机双精度
- 如何自定义设置随机的范围?
- 随机选择 2 个不在范围内的整数
- 随机整数仍在生成低于或高于范围的数字?
- 范围 - v3 中的随机播放操作
- 有没有有效的方法可以从现在开始生成从范围到 10 天的随机date_time
- C 使用单个生成器从多个范围内提升随机INT
- 编写一个程序,该程序在0-99范围内生成10000个随机整数,并从随机数据中产生直方图
- C++随机访问迭代器超出范围
- 需要在指定范围内生成一个随机整数
- MFC对话框成员变量的随机崩溃不在范围中
- 特征矩阵库在给定范围内用随机浮点值填充矩阵
- 在多次迭代中创建随机大小(在特定范围内)的数组
- 在数组中随机生成固定范围的数字,在该 2D 数组中没有重复行
- 在C++中实现随机预言机(输出在范围内是随机的,但对于相同的输入输出是相同的)
- 从用户输入的范围中为不同的类创建不同的随机x,y值
- 如何用范围内的随机值填充数组?(可以复制.)
- 为什么标准不允许 std::for_each 对无效的随机访问迭代器范围有明确定义的行为?
- 无法为整数生成全范围的随机
- 使用 std::random 创建全范围的随机浮点数