例如,以下表达式:
r = (rand() % 10)+1;
从1-10生成随机数。
我们如何让它从0-10生成随机数呢?
谢谢。
发布于 2011-02-07 16:38:38
你就快到了!rand()函数返回一个非常大范围(从0到RAND_MAX)的随机值。使用模运算符将其封装到一个较小的范围内(从0到9,因为您是通过10进行建模的),然后+1将其从1移动到10。
要获得0到10之间的值,您可以使用rand并将其值修改为11:
r = rand() % 11;更一般地,要获得0,n范围内的随机值,您可以这样写
r = rand() % (n + 1);最后,要获得k,n+k范围内的值,您可以这样写
r = rand() % (n + 1) + k;当然,正如纯粹主义者会指出的那样,这并不一定会给出真正统一的值,因为按某个值修改rand()不会均匀地分配所有的整数。这通常不是问题(您会有非常非常小的偏差),但如果是这样的话,您可能需要考虑使用比rand()更健壮的随机数生成器。
发布于 2011-02-07 16:37:09
您可以省略+1,从0开始。由于您需要11个不同的值,因此您需要计算模11而不是10的余数。
r = rand() % 11;请注意,您需要为PRNG设定种子,这样它就不会总是生成相同的序列。
而且标准的rand()函数也很烂。随机数的质量非常低,不适合用于许多目的。我强烈建议使用更好的生成器。
Mersenne twister是一种流行的选择,在我的一个项目中,我使用了Well512,因为它快速、良好且易于实现。
如果用户不能预测随机数,即使是那些好的PRNG也是不够的,您必须选择一个加密PRNG。它们既不能被预测(用现实的计算能力),也不能与真实的随机数区分开来,除非你知道种子。不过,它们的速度要慢一些。
发布于 2013-07-31 10:13:16
在使用std::uniform_real_distribution或整数情况下的std::uniform_int_distribution的C++11中,生成均匀分布要简单得多,也不容易出错。下面是一个使用std::uniform_real_distribution的示例,它显示了一个简单的图形,以粗略地演示它是统一的:
#include <iostream>
#include <iomanip>
#include <string>
#include <random>
int main()
{
std::random_device rd;
//
// Engines
//
std::mt19937 e2(rd());
//std::knuth_b e2(rd());
//std::default_random_engine e2(rd()) ;
std::uniform_real_distribution<> dist(0, 10);
const int nstars=95; // maximum number of stars to distribute
const int nintervals=10; // number of intervals
int p[nintervals]={};
for (int i=0; i<100000; ++i)
{
double number = dist(e2);
++p[int(number)];
}
std::cout << std::fixed; std::cout.precision(1);
for (int i=0; i<nintervals; ++i)
{
std::cout << float(i) << "-" << std::setw(4) << float(i+1) << ": ";
std::cout << std::string(p[i]*nstars/100000,'*') << std::endl;
}
return 0 ;
}示例结果:
0.0- 1.0: *********
1.0- 2.0: *********
2.0- 3.0: *********
3.0- 4.0: *********
4.0- 5.0: *********
5.0- 6.0: *********
6.0- 7.0: *********
7.0- 8.0: *********
8.0- 9.0: *********
9.0-10.0: *********部分示例代码取自此reference。
https://stackoverflow.com/questions/4919303
复制相似问题