【问题标题】:Is it possible to select random numbers from a defined set of numbers是否可以从定义的一组数字中选择随机数
【发布时间】:2018-02-28 14:25:05
【问题描述】:

随机函数通常在给定范围内生成随机数。但是可以从预定义的列表中随机选择吗?例如,我有 [1,4,5,6],我只想从这个列表中随机选择。如果是这样,怎么做? 谢谢 :) P.s:: C++ 代码对我有很大帮助^^

【问题讨论】:

    标签: c++ function c++11 random


    【解决方案1】:

    下面的代码会有所帮助,我们可以在集合中选择一个随机索引,而不是选择一个随机整数;

    int numbers[4] = {1,4,5,6};
    
    srand (time(NULL));
    int index = rand() % 4;
    
    int number = numbers[index];
    

    这是一个使用 <random> 的 C++11 版本:

    #include <random>
    
    int numbers[4] = {1,4,5,6};
    
    std::default_random_engine generator;
    std::uniform_int_distribution<int> distribution(0,3);
    int index = distribution(generator);  // generates number in the range 0..3
    
    int number = numbers[index];
    

    【讨论】:

    • 我投反对票,因为它被标记为c++11,我希望该解决方案能够利用&lt;random&gt;
    • @Zereges 感谢您的指出。我在那里添加了一个&lt;random&gt; 替代方案,似乎&lt;random&gt; 不支持从列表中选择?是吗?
    • 另外rand()%n 是有偏见的,除非n 划分RAND_MAX+1n=4 通常是这种情况,但通常情况并非如此。虽然对于小型 n 和可能可以接受的临时用例。
    • @persixty 很好,我会牢记这一点
    【解决方案2】:

    这样做的好方法可能是使用随机播放。基本上,你打乱数组,然后开始一个一个地选择数字

    #include <iostream>     // std::cout
    #include <algorithm>    // std::shuffle
    #include <array>        // std::array
    #include <random>       // std::default_random_engine
    
    int main () {
        std::array<int, 4> foo {1,4,5,6};
    
        std::shuffle(foo.begin(), foo.end(), std::default_random_engine(12345));
    
        std::cout << "shuffled elements:";
        for (int x: foo)
            std::cout << ' ' << x;
        std::cout << '\n';
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-10
      • 1970-01-01
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多