在C++中生成1到3之间的随机数

Pet*_*fic 1 c++ random

可能重复:
从范围生成随机整数

我刚刚开始学习C++,我正在尝试生成一个1,2或3的随机整数.我搜索过,我看到的生成随机数的所有例子都令人困惑,总是与我看到的最后一个例子不同.有一个简单的方法吗?

Joe*_*cou 9

模数解决方案是最直接的,但它通常会失去随机性作为模数,因为倾向于"吃掉"结果的最低位.

一种更随机的方法是映射[0,1 [over [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;
}
Run Code Online (Sandbox Code Playgroud)

通用版本可以从这些版本中获得,以获得滚动(T min,T max)版本.


Set*_*gie 8

试试这个:

srand(time(NULL));

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

这通过将rand函数的返回值的剩余部分除以3(可以是0,1或2)并添加一个(以得出1,2或3)来工作.

确保包含cstdlibctime标题.

此外,srand只调用一次,而不是每次生成一个随机数.

  • 这种错误不断地反复出现.问题在于它本身就是它的饲料,而且在网络上很常见,很难根除.这是用于在一定范围内生成随机数的标准**反模式**.有两个问题.1)来自rand()的底部位比顶部位少(%基本上使用底部位).2)除非除数(在这种情况下为3)是RAND_MAX的精确因子,否则最后几个值的可能性略小于其他值(从而使概率偏差). (6认同)
  • @Martin:你不能说底部位不那么随机.这曾经是八十年代的一个问题.而你的"更好的选择"并不能解决倾斜的概率.如果您需要防弹随机数生成,请使用Boost内容或C++ 11.对于初学者来说,这就足够了. (2认同)
  • 绝对是一个更好的解决方案是使用Boost随机数生成器,它是由实际了解与随机数相关的问题的人编写的.实际上我提出的解决方案(不是我的)确实解决了偏斜问题(注意它使用实数而不是整数).同样的是,底部位的不良随机分布是一个已经变得更好的老问题.但除非你知道rand正在做什么,否则你无法判断它是否已经在你的rand()变体中解决了.因此,它在安全方面更便携,并且可以编写可在任何地方使用的代码. (2认同)