【问题标题】:C++ random number generatorC++ 随机数生成器
【发布时间】:2013-11-07 13:43:25
【问题描述】:

我正在写一个抽奖申请。我有一个名为 generateLotteryNumbers 的函数,它接收一个数组并用 5 个随机数填充该数组。我想要做的是让这个函数在每次调用这个函数时产生一组不同的随机数。

void generateLotteryNumbers(int lotteryNumbers[])
{

    srand (time(NULL));
    const int arraySize = 5;
    int index = 0;

    while (index < arraySize)
    {
        lotteryNumbers[index] = rand() % 50 + 1;
        cout << lotteryNumbers[index] << endl;
        index++;
    }
}

此刻的输出是eg:

5
24
45
26
47

重复两次。

【问题讨论】:

标签: c++ random srand


【解决方案1】:

调用srand只需要一次,通常在main 的代码开头。

【讨论】:

    【解决方案2】:

    宽度 C++11 标准,可以使用新的number generators。为了始终获得不同的结果,通常您必须在每次程序执行时设置不同的种子,例如时间。

    【讨论】:

      【解决方案3】:

      您可以查看提供更好的伪随机数生成器(例如 Mersenne Twister )的 c++11 功能以及可用于为生成器提供硬件熵源的 random_device 接口。

      std::vector 和 c++11 &lt;random&gt; 功能的示例:

      vector<int> generateLotteryNumbers(int size)
      {
          static std::random_device rseed;
          static mt19937 rgen(rseed());
          uniform_int_distribution<int> idist(1,50); 
      
          vector<int> result;
          for(int i = 0; i < size; ++i) {
              result.push_back(idist(rgen));
              cout << result[i] << endl;
          }
          return result;
      }
      

      另请注意,如果您要生成彩票号码,您可能不希望在同一个数组中出现两次相同的值,在这种情况下,您必须在代码中添加更多逻辑。

      【讨论】:

        【解决方案4】:

        您不应多次致电srand。此外,您不应该使用rand 这种方式生成彩票号码(好的,取决于彩票,但我认为不允许重复号码)。您可以使用std::random_shuffle 轻松完成此操作

        int main()
        {
            int numbers[49];  // all numbers
            std::iota(begin(numbers), end(numbers), 1);  // fill with 1-49
        
            // shuffle numbers
            std::random_shuffle(begin(numbers), end(numbers));  
        
            // use first 5 numbers:
            std::copy(begin(numbers), begin(numbers) + 5, 
                std::ostream_iterator<int>(std::cout, " "));
        }
        

        【讨论】:

          猜你喜欢
          • 2011-01-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-24
          • 1970-01-01
          • 2016-08-15
          • 2017-04-10
          • 1970-01-01
          相关资源
          最近更新 更多