注册 登录
编程论坛 C++教室

如何高效的生成指定区间的随机数

陈紫文 发布于 2018-11-08 16:49, 1544 次点击
生成[a,b]区间上的随机数,a>0,a,b为整数
命中率要非常高
谢谢
//我现在一个还有两分,但还是麻烦大家帮帮忙
3 回复
#2
rjsp2018-11-08 16:56
直接看示例 https://en.
程序代码:
#include <random>
#include <iostream>

int main()
{
    std::random_device rd;  //Will be used to obtain a seed for the random number engine
    std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
    std::uniform_int_distribution<> dis(1, 6);

    for (int n=0; n<10; ++n)
        //Use dis to transform the random unsigned int generated by gen into an int in [1, 6]
        std::cout << dis(gen) << ' ';
    std::cout << '\n';
}
就是上图中的 std::uniform_int_distribution<> dis(1, 6)

命中率要非常高
听不懂

#3
rohalloway2018-11-08 21:04
学习了,最近就遇到了随机数的需求问题,
时间种子的随机数,同时生成多个随机数就会出现随机数相同的问题
版主的例子非常好用,收藏起来了,谢谢!
#4
rjsp2018-11-09 08:37
回复 3楼 rohalloway
你是想生成无重复数字的随机数吗,那得用 std::shuffle
参见:https://en.

程序代码:
#include <random>
#include <algorithm>
#include <iterator>
#include <iostream>

int main()
{
    std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    std::random_device rd;
    std::mt19937 g(rd());

    std::shuffle(v.begin(), v.end(), g);

    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << "\n";
}
可能的输出
8 6 10 4 2 3 7 1 9 5

1