在0和10之间生成随机数

5

如何生成0到10之间的随机数?你能给我一个生成随机数的示例吗?


2
随机性很难正确处理,你应该首先确定你需要随机数的用途。rand 可以用于 RPG 骰子掷出,但对于涉及货币、任何涉及密码学或建模噪声的游戏都不合适,尤其是 DSP 模拟。 - jk.
大多数情况下,您可以使用Mersenne Twister。 - quant_dev
另一个问题,用户692270接受了@karthik的问题。 - Sebastian Mach
@SebastianMach 接受的答案是在问题发布后2分钟发布的。该答案被标识为karthik所发布...之前是否曾被标识为由用户692270发布,可能是一个傀儡账户? - Jim Balter
@JimBalter:我猜它们已经合并了。要么是这样,要么就是被禁止了。但我打赌是合并了。 - Sebastian Mach
4个回答

16

1) 不应该使用 rand(),因为它分布不均匀,周期短等问题...

2) 当 MaxValue % x != 0 时,不应该使用 %x,因为这会破坏你的均匀分布(假设你没有使用 rand()),例如 32767 % 10 = 7,所以数字0-7更有可能出现。

请查看此链接了解更多信息:Going native 2013 - Stephan T. Lavavej - rand() Considered Harmful

你应该使用类似以下代码:

#include <random>

std::random_device rdev;
std::mt19937 rgen(rdev());
std::uniform_int_distribution<int> idist(0,10); //(inclusive, inclusive) 

在我的代码中,我使用类似以下的语句:

template <typename T>
T Math::randomFrom(const T min, const T max)
{
    static std::random_device rdev;
    static std::default_random_engine re(rdev());
    typedef typename std::conditional<
        std::is_floating_point<T>::value,
        std::uniform_real_distribution<T>,
        std::uniform_int_distribution<T>>::type dist_type;
    dist_type uni(min, max);
    return static_cast<T>(uni(re));
}

注意:该实现不是线程安全的,并且每次调用都会构造一个分布。这是低效的。但是您可以根据自己的需求进行修改。


8
  /* rand example: guess the number */
  #include <stdio.h>
  #include <stdlib.h>
  #include <time.h>

  int main ()
  {
       int iSecret, iGuess;

       /* initialize random seed: */
       srand ( time(NULL) );

       /* generate secret number: */
       iSecret = rand() % 10 + 1;

        do {
          printf ("Guess the number (1 to 10): ");
          scanf ("%d", &iGuess);
          if (iSecret < iGuess) puts ("The secret number is lower");
          else if (iSecret > iGuess) puts ("The secret number is higher");
        } while (iSecret != iGuess);

      puts ("Congratulations!");
      return 0;
    }

iSecret变量将提供1到10之间的随机数。


@JimBalter:并不是这样;自问自答不仅可以接受,而且实际上是被鼓励的。而且,在2011年时,还没有办法同时发布问题和答案。 - Lightness Races in Orbit
请允许我提及这段代码的来源(与此相同,只是我为if / else条件进行了一些小的格式调整,这些条件没有考虑空格字符):https://cplusplus.com/reference/cstdlib/rand/?kw=rand - ivanleoncz


2

random_integer = rand()%10; 应该可以解决问题。

random_integer = rand()%11; 用于生成0到10之间的所有数字,包括10在内...


是的... 但我想他/她已经明白了 :) - Fortega
3
(虽然在这种情况下实际上并不重要,但请注意,这将通过设计产生一个略微有偏差的分布。取模运算是一种“环绕”操作,因此对于任何不是模数的倍数的数字范围,输出结果都会有偏差。幸运的是,在这里偏差不大,因为rand()通常输出32位数字,而10是一个相对较小的模数 - 数字0到5只比其他数字更可能出现1.000000023倍。这在“随机噪声”范围内,可能可以忽略不计。尽管如果模数很大,这样的事情可能会有影响。) - Damon
在Windows上,RAND_MAX只有32767(15位),因此获得9或10的偏差约为1/3000。 - jk.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接