如何在 c++ 中生成负随机整数
How to generate negative random integer in c++
我写了一个接受整数的函数。如果用户键入例如 -5,它不会崩溃,但它会将其转换为正 =-(
int getRandoms(int size, int upper, int lower)
{
int randInt = 0;
randInt = 1 + rand() % (upper -lower + 1);
return randInt;
}
为了构建随机负整数,我应该在函数中更改什么?用户输入范围。
对此有两个答案,如果您使用的是C++11,那么您应该使用uniform_int_distribtion,出于多种原因,例如为什么人们说使用随机数生成器时存在模偏差? 是一个例子,rand() 被认为是有害的演示文稿给出了一组更完整的原因。下面是一个从-5 to 5
生成随机整数的示例:
#include <iostream>
#include <random>
int main()
{
std::random_device rd;
std::mt19937 e2(rd());
std::uniform_int_distribution<int> dist(-5, 5);
for (int n = 0; n < 10; ++n) {
std::cout << dist(e2) << ", " ;
}
std::cout << std::endl ;
}
如果 C++11 不是一个选项,那么 C FAQ 中描述的方法 如何获得特定范围内的随机整数?是要走的路。使用该方法,您将执行以下操作以从[M, N]
生成随机整数:
M + rand() / (RAND_MAX / (N - M + 1) + 1)
对于闭合范围内的数字 [lower,upper]
,您需要:
return lower + rand() % (upper - lower + 1); // NOT 1 + ...
这将适用于正值或负值,只要upper
大于或等于 lower
。
您的版本从相同大小的范围内返回数字,但从 1
开始,而不是从 lower
开始。
你也可以使用Boost.Random,如果你不介意依赖关系的话。 http://www.boost.org/doc/libs/1_54_0/doc/html/boost_random.html
您希望从计算数字的范围开始,因此(例如)-10 到 +5 是 15 的范围。
您可以使用如下代码计算该范围内的数字:
int rand_lim(int limit) {
/* return a random number in the range [0..limit)
*/
int divisor = RAND_MAX/limit;
int retval;
do {
retval = rand() / divisor;
} while (retval == limit);
return retval;
}
完成此操作后,将数字添加到正确的范围非常简单:将下限添加到您获得的每个数字。
请注意,C++11 添加了随机数生成器和分布类,可以为您处理大部分问题。
如果您尝试自己执行此操作,则当您将数字减少到一个范围时,您几乎需要使用我上面显示的循环以避免倾斜。从本质上讲,任何仅使用除法或余数的尝试几乎不可避免地会在结果中引入偏斜(即,某些结果会比其他结果更频繁地发生)。
你只需要求和到范围[lbound, ubound]
的下限:
int rangesize = ubound - lbound + 1;
int myradnom = (rand() % rangesize) + lbound;
- 生成线性随机整数C++
- 如何生成 0 到 0x7FFFFFFF 的随机整数?
- 生成随机整数
- C++:随机数列表:x 个随机整数
- 列出小于 10 的不同随机整数
- 在 c++ 中生成随机整数
- 随机整数仍在生成低于或高于范围的数字?
- C++,为什么我不能使用两个默认随机引擎生成独立的随机整数样本
- 在 C++ 中使用 10 个随机整数的数组进行气泡排序不起作用
- C++ 如何生成 10,000 个 UNIQUE 随机整数以存储在 BST 中?
- 如何将唯一的随机整数插入链表中
- 伪随机整数
- 将随机整数写入文本文件而不重复
- 编写一个程序,该程序在0-99范围内生成10000个随机整数,并从随机数据中产生直方图
- 尝试创建随机整数向量时的OpenMPI编译器错误
- 防止随机整数不断被重新分配
- 除法函数随机整数需要打印出商和余数
- 如何生成升序随机整数列表
- 需要在指定范围内生成一个随机整数
- 对随机整数的未定义引用