【问题标题】:Generate Random number between 0 and 10生成 0 到 10 之间的随机数
【发布时间】:2011-08-10 06:19:26
【问题描述】:

如何生成 0 到 10 之间的随机数?我可以提供这个随机数生成的样本吗?

【问题讨论】:

  • 随机性很难正确处理,您应该首先确定您需要随机数的目的。 rand 可能适合 rpg 掷骰子,但完全不适合涉及金钱的游戏,任何涉及密码学或建模噪声的东西都是 DSP 模拟
  • 大多数时候你会用 Mersenne Twister 做得很好。
  • user692270 接受@karthik 问题的另一个问题。
  • @SebastianMach 接受的答案是在问题发布 2 分钟后发布的。答案是由 karthik 确定的,他提出了这个问题……它之前是否被确定为 user692270 发布的,大概是一个 sockpuppet?
  • @JimBalter:我猜他们已经合并了。要么这样,要么禁止。但我赌的是合并。

标签: c++ math random


【解决方案1】:

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));
}

注意:实现不是线程安全的,并为每个调用构造一个分布。那是低效的。但您可以根据需要对其进行修改。

【讨论】:

    【解决方案2】:
    【解决方案3】:

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

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

    【讨论】:

    • 是的......我想他/她得到了图片:)
    • (在这种情况下实际上并不重要,但请注意,这会在设计上产生略微偏差的分布。模是一种“环绕”操作,因此对于任何不是模数的倍数,输出会有偏差。幸运的是,这里的偏差不是很大,因为 rand() 通常输出一个 32 位的数字,而 10 是一个相对较小的模数 - 数字 0 到 5 的可能性仅为 1.000000023 倍其他的。这完全在“随机噪声”范围内,可能可以忽略不计。尽管如果模数更大,这样的事情可能很重要。)
    • 在 Windows 上 RAND_MAX 仅为 32767(15 位),因此获得 9 或 10 会有大约 1/3000 的偏差
    【解决方案4】:
      /* 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 年,就​​无法同时发布问题的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 2011-04-29
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多