首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++随机数生成

C++随机数生成
EN

Stack Overflow用户
提问于 2011-02-07 16:35:37
回答 5查看 10.3K关注 0票数 5

例如,以下表达式:

r = (rand() % 10)+1;

1-10生成随机数。

我们如何让它从0-10生成随机数呢?

谢谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-02-07 16:38:38

你就快到了!rand()函数返回一个非常大范围(从0到RAND_MAX)的随机值。使用模运算符将其封装到一个较小的范围内(从0到9,因为您是通过10进行建模的),然后+1将其从1移动到10。

要获得0到10之间的值,您可以使用rand并将其值修改为11:

代码语言:javascript
复制
r = rand() % 11;

更一般地,要获得0,n范围内的随机值,您可以这样写

代码语言:javascript
复制
r = rand() % (n + 1);

最后,要获得k,n+k范围内的值,您可以这样写

代码语言:javascript
复制
r = rand() % (n + 1) + k;

当然,正如纯粹主义者会指出的那样,这并不一定会给出真正统一的值,因为按某个值修改rand()不会均匀地分配所有的整数。这通常不是问题(您会有非常非常小的偏差),但如果是这样的话,您可能需要考虑使用比rand()更健壮的随机数生成器。

票数 16
EN

Stack Overflow用户

发布于 2011-02-07 16:37:09

您可以省略+1,从0开始。由于您需要11个不同的值,因此您需要计算模11而不是10的余数。

代码语言:javascript
复制
r = rand() % 11;

请注意,您需要为PRNG设定种子,这样它就不会总是生成相同的序列。

而且标准的rand()函数也很烂。随机数的质量非常低,不适合用于许多目的。我强烈建议使用更好的生成器。

Mersenne twister是一种流行的选择,在我的一个项目中,我使用了Well512,因为它快速、良好且易于实现。

如果用户不能预测随机数,即使是那些好的PRNG也是不够的,您必须选择一个加密PRNG。它们既不能被预测(用现实的计算能力),也不能与真实的随机数区分开来,除非你知道种子。不过,它们的速度要慢一些。

票数 10
EN

Stack Overflow用户

发布于 2013-07-31 10:13:16

在使用std::uniform_real_distribution或整数情况下的std::uniform_int_distribution的C++11中,生成均匀分布要简单得多,也不容易出错。下面是一个使用std::uniform_real_distribution的示例,它显示了一个简单的图形,以粗略地演示它是统一的:

代码语言:javascript
复制
#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 ;
}

示例结果:

代码语言:javascript
复制
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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4919303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档