【问题标题】:Generate random number between 1 and 3 in C++ [duplicate]在C ++中生成1到3之间的随机数[重复]
【发布时间】:2011-08-19 00:10:44
【问题描述】:

可能重复:
Generating random integer from a range

我刚开始学习 C++,我正在尝试生成一个随机整数,即 1、2 或 3。我四处搜索,我看到的所有生成随机数的示例都令人困惑,并且总是与我上一个示例不同看着。有没有简单的方法来做到这一点?

【问题讨论】:

  • 现在是接受答案的好时机,因为您得到了两个很好的答案,而对于这个简单的问题,您不会得到任何更好的答案。请注意,因为您自己解决了一个问题而放弃它只是一种不好的做法。

标签: c++ random


【解决方案1】:

模数解决方案是最直接的,但它通常会像“吃掉”结果的最低位的趋势一样失去模数的随机性。

更随机的方式是将 [0,1[ 以线性方式映射到 [a,b[ :

int roll(int min, int max)
{
   // x is in [0,1[
   double x = rand()/static_cast<double>(RAND_MAX+1); 

   // [0,1[ * (max - min) + min is in [min,max[
   int that = min + static_cast<int>( x * (max - min) );

   return that;
}

一个通用的版本是从这些微不足道的得到一个roll(T min, T max)版本。

【讨论】:

  • 看来是这个实现的一个小bug——让rand()返回RAND_MAXx会变成1.0(所以范围实际上是[0,1] 包含)导致that超出函数的指定范围1。换句话说,roll(0,2)通常返回0或1,但偶尔会返回2。:)
  • 快!然后除以 RAND_MAX+1 可能会更好。
  • 在为地形生成器测试不同的 PRNG 时发现了这一点,并继续得到这个one white tile。由于我们还没有实现“雪”,所以它看起来不合适。 :)
【解决方案2】:

试试这个:

srand(time(NULL));

int randNum = (rand() % 3) + 1; // you don't need the (...) surrounding rand() % 3 but it helps for clarity

这是通过将rand 函数的返回值除以三(可以是 0、1 或 2)再加一(得出 1、2 或 3)来实现的。

确保包含 cstdlibctime 标头。

另外,只调用一次srand,而不是每次生成随机数。

【讨论】:

  • 在C++中是&lt;cstdlib&gt;
  • 非常感谢,已修复。
  • 这个错误不断重复,一次又一次。问题在于它是自给自足的,而且在网络上很常见,很难根除。这是在一个范围内生成随机数的标准反模式。有两个问题。 1) rand() 的低位比高位随机性小(% 基本上使用低位)。 2) 除非除数(在这种情况下为 3)是 RAND_MAX 的精确因子,否则最后几个值的概率略低于其他值(因此会扭曲你的概率)。
  • @Martin:您不能说底部位的随机性较低。这在八十年代曾经是一个问题。而你的“更好的选择”并不能解决倾斜的概率。如果您需要防弹随机数生成,请使用 Boost 或 C++11。对于初学者来说,这就足够了。
  • 绝对更好的解决方案是使用 Boost 随机数生成器,它是由真正了解与随机数相关的问题的人编写的。实际上我提出的解决方案(不是我的)确实解决了偏斜问题(注意它使用实数而不是整数)。同样是的,底部位的不良随机分布是一个老问题,现在已经变得更好了。但是,除非您知道 rand 在做什么,否则您无法判断它是否已在您的 rand() 变体中解决。因此,从安全的角度来看,它更便于播放,并且可以编写在任何地方都可以使用的代码。
【解决方案3】:

编写一个 C++ 程序来生成 0 到 50 范围内的 25 个随机数。您应该使用队列将它们分组到类别中。输出程序示例如下图:

输出:

欢迎观看数据分类演示。 我们生成 25 个随机数,然后使用队列将它们分组。

分类数据: 24 7 31 23 26 14 19 8 9 6 43 16 22 0 39 46 22 38 41 23 19 18 14 3 41 数据分类结束

数据 0.. 9 : 7 8 9 6 0 3
数据 10..19 : 14 19 16 19 18 14
数据 20..29 : 24 23 26 22 22 23
29 岁以上的数据:31 43 39 46 38 41 41

【讨论】:

    猜你喜欢
    • 2013-01-02
    • 1970-01-01
    • 2010-12-06
    • 2013-12-21
    • 2021-01-06
    • 1970-01-01
    • 2014-04-02
    • 2013-07-24
    相关资源
    最近更新 更多