C++ 如何在C+;中生成均匀随机整数而不重复+;

C++ 如何在C+;中生成均匀随机整数而不重复+;,c++,g++,visual-studio-2015,C++,G++,Visual Studio 2015,我想生成一个随机整数,它遵循均匀分布,不重复。例如,我将用这段代码生成6个统一的数字 vector<int> container; container.reserve(lossNum); std::vector<unsigned int>::iterator it; // Our Random Generator std::mt19937 eng{ std::random_device{}() }; int max_num=6 for (int i = 0;

我想生成一个随机整数,它遵循均匀分布,不重复。例如,我将用这段代码生成6个统一的数字

 vector<int> container;
 container.reserve(lossNum);
 std::vector<unsigned int>::iterator it;
 // Our Random Generator
 std::mt19937 eng{ std::random_device{}() };
 int max_num=6
 for (int i = 0; i<max_num; i++) {
     unsigned int q = std::uniform_int_distribution<unsigned int>{ 0, max_num }(eng);

     do {
         q = std::uniform_int_distribution<unsigned int>{ 0, max_num }(eng);
         it = std::find(container.begin(), container.end(), q);
     } while (it != container.end());

     container.push_back(q);
 }
向量容器;
集装箱储备(lossNum);
std::vector::it迭代器;
//我们的随机发生器
std::mt19937 eng{std::random_device{}()};
int max_num=6
对于(int i=0;i
  • 代码示例
  • 看看你的代码,它看起来像是你重新发明了轮子。MSVC 2015应该支持
    std::shuffle
    ,这样你就可以用它做同样的事情:

    int max_num = 6;
    // Create vector
    std::vector<int> container(max_num);
    // Fill it with numbers 0, 1, ..., max_num - 1)
    std::iota(container.begin(), container.end(), 0)
    // Create random engine generator
    std::mt19937 eng{ std::random_device{}() };
    // shuffle it!!
    std::shuffle(container.begin(), container.end(), eng);
    
    int max_num=6;
    //创建向量
    标准::向量容器(最大数量);
    //用数字0、1、…、max_num-1填充)
    std::iota(container.begin()、container.end()、0)
    //创建随机引擎生成器
    std::mt19937 eng{std::random_device{}()};
    //洗牌!!
    std::shuffle(container.begin(),container.end(),eng);
    
    所有肮脏的事情都是你干的,不是你干的

  • 随机性
  • 是否确实要在[0,6]中生成6个数字? 为什么7号不能全部拥有呢

    我在我的计算机上测试了您的代码,重复了120000次,我: 0丢失了17335次 1缺失16947次 2缺失17054次 3缺失17116次 4号失踪17330次 5丢失了17114次 6缺失17105次

    这里看起来是统一的,但我使用g++。可能是msvc std库有问题,但我不能提供更多信息,因为我不使用它

  • 代码示例
  • 看看你的代码,看起来你重新发明了轮子。MSVC 2015应支持std::shuffle
    ,因此您可以对以下各项执行相同的操作:

    int max_num = 6;
    // Create vector
    std::vector<int> container(max_num);
    // Fill it with numbers 0, 1, ..., max_num - 1)
    std::iota(container.begin(), container.end(), 0)
    // Create random engine generator
    std::mt19937 eng{ std::random_device{}() };
    // shuffle it!!
    std::shuffle(container.begin(), container.end(), eng);
    
    int max_num=6;
    //创建向量
    标准::向量容器(最大数量);
    //用数字0、1、…、max_num-1填充)
    std::iota(container.begin()、container.end()、0)
    //创建随机引擎生成器
    std::mt19937 eng{std::random_device{}()};
    //洗牌!!
    std::shuffle(container.begin(),container.end(),eng);
    
    所有肮脏的事情都是你干的,不是你干的

  • 随机性
  • 是否确实要在[0,6]中生成6个数字? 为什么7号不能全部拥有呢

    我在我的计算机上测试了您的代码,重复了120000次,我: 0丢失了17335次 1缺失16947次 2缺失17054次 3缺失17116次 4号失踪17330次 5丢失了17114次 6缺失17105次

    这里看起来是统一的,但我使用g++。msvc std库可能有问题,但我无法提供更多信息,因为我不使用它。

    永远不要这样做:

    do {
         q = std::uniform_int_distribution<unsigned int>{ 0, max_num }(eng);
         it = std::find(container.begin(), container.end(), q);
     } while (it != container.end());
    
    do{
    q=std::均匀分布{0,max_num}(英文);
    it=std::find(container.begin(),container.end(),q);
    }while(it!=container.end());
    
    您正在拾取一个图元,如果之前已经选择了该图元,则将其拒绝。从计算角度来看,这是一个禁忌

    你想要的是一种叫做Knuth shuffle(又名Fisher-Yates shuffle)的东西。 这种算法允许您随机选取向量的元素(这里是一个包含6个数字[0;6[)的向量),而无需替换

    “费舍尔-耶茨洗牌类似于从帽子中随机挑选编号的票子(组合数学:可分辨的对象),直到没有票子为止,不进行替换。”在

    选举权代码:

    #include <stdlib.h>
    
    /* Arrange the N elements of ARRAY in random order.
    Only effective if N is much smaller than RAND_MAX;
    if this may not be the case, use a better random
    number generator. */
    void shuffle(int *array, size_t n)
    {
        if (n > 1) {
            size_t i;
            for (i = 0; i < n - 1; i++) {
                size_t j = i + rand() / (RAND_MAX / (n - i) + 1);
                int t = array[j];
                array[j] = array[i];
                array[i] = t;
            }
        }
    }
    
    #包括
    /*按随机顺序排列数组的N个元素。
    仅当N远小于RAND_MAX时有效;
    如果情况并非如此,请使用更好的随机变量
    数字发生器*/
    无效洗牌(整数*数组,大小\u t n)
    {
    如果(n>1){
    尺寸i;
    对于(i=0;i
    永远不要这样做:

    do {
         q = std::uniform_int_distribution<unsigned int>{ 0, max_num }(eng);
         it = std::find(container.begin(), container.end(), q);
     } while (it != container.end());
    
    do{
    q=std::均匀分布{0,max_num}(英文);
    it=std::find(container.begin(),container.end(),q);
    }while(it!=container.end());
    
    你正在选择一个元素,如果你之前已经选择了它,那么就拒绝它。从计算角度来说,这是不允许的

    你想要的是一种叫做Knuth shuffle(又名Fisher-Yates shuffle)的东西。 这种算法允许您随机选取向量的元素(这里是一个包含6个数字[0;6[)的向量),而无需替换

    “费舍尔-耶茨洗牌类似于从帽子中随机挑选编号的票子(组合数学:可分辨的对象),直到没有票子为止,不进行替换。”在

    选举权代码:

    #include <stdlib.h>
    
    /* Arrange the N elements of ARRAY in random order.
    Only effective if N is much smaller than RAND_MAX;
    if this may not be the case, use a better random
    number generator. */
    void shuffle(int *array, size_t n)
    {
        if (n > 1) {
            size_t i;
            for (i = 0; i < n - 1; i++) {
                size_t j = i + rand() / (RAND_MAX / (n - i) + 1);
                int t = array[j];
                array[j] = array[i];
                array[i] = t;
            }
        }
    }
    
    #包括
    /*按随机顺序排列数组的N个元素。
    仅当N远小于RAND_MAX时有效;
    如果情况并非如此,请使用更好的随机变量
    数字发生器*/
    无效洗牌(整数*数组,大小\u t n)
    {
    如果(n>1){
    尺寸i;
    对于(i=0;i
    由于文本中没有“random”一词,
    container.push_back(i)
    就可以了。对不起,一定是这样random@user8430我不知道这有什么帮助,但您连续两次请求一个随机数-在
    do while
    循环之前和循环中。尝试声明
    unsigned int q;
    而不将其初始化为随机数。可能会有帮助。因为您没有“random”这个词在文本中,
    container.push_back(i)
    就可以了。对不起,一定是这样random@user8430我不知道这有什么帮助,但是你连续两次请求一个随机数-在
    do while
    循环之前和循环中。尝试声明
    unsigned int q;
    ,而不将其初始化为随机数。可能会有帮助。你能向g++展示上面的代码吗?我想在Ubu中构建它ntuI认为所有的代码都已经存在。如果你想使用
    std::shuffle
    ,上面的代码应该可以完成这项工作。否则,我用do…while循环测试了你的代码。