【问题标题】:C++ random number between 2 numbers reset2个数字之间的C ++随机数重置
【发布时间】:2011-12-09 17:18:28
【问题描述】:

下面的函数运行,但每次运行程序时总是返回相同的数字。有没有办法在我每次运行程序时生成不同的随机数?

int getrand(int min,int max){
 int rnum = rand()%(max-min)+min;
 return rnum;  
} 

【问题讨论】:

  • 您确实意识到您的代码存在问题有两个原因?首先,maxmin 与某些库/API 中的#defines 和函数冲突,其次,% 会导致分布不均匀,除非模数(意外)是 2 的幂。“正确”在某个范围内生成随机数的方法是生成随机数并拒绝超出范围的随机数。关于实际问题,您想在程序启动时srand一次。
  • 在任何地方都不能有名为maxmin 的宏,因为这些是标准库中函数的名称;如果存在这样的宏,则不能使用标准库。
  • @Damon 虽然你必须拒绝一些数字以避免偏见,但你不能仅仅拒绝那些超出范围的数字;如果范围是 [0, 1],您将不得不拒绝大量数字。
  • @JamesKanze:Windows API 是其中minmax 宏的API 的一个示例(除非您明确禁用它们)。是的,它们与<algorithm> 中的模板类冲突,这实际上是将它们作为函数的“某些库”的示例。我说的到底哪里不对?一个名为 minmax 的变量由于这个确切原因有问题。
  • @Damon 如果您使用正确的编译器调用,Windows API 不会定义它们(尽管不可否认,它不应该定义它们,句号)。使用minmax 作为局部变量绝对没有错。

标签: c++ random numbers


【解决方案1】:

您可能希望使用高质量的标准库随机数生成工具:

#include <random>

typedef std::mt19937 rng_type;
std::uniform_int_distribution<rng_type::result_type> udist(min, max);

rng_type rng;

int main()
{
  // seed rng first:
  rng_type::result_type const seedval = 4; // or implement a good get_seed()?
  rng.seed(seedval);

  rng_type::result_type random_number = udist(rng);

  return random_number;
}

【讨论】:

  • @user1054513:这只是一个例子。您必须提供自己的种子价值。如果您想不出来,请使用4
  • @user1054513 这是因为它是为生成器提供种子的函数的通用占位符。很多时候,一些时间函数用于此目的,因为每次运行它时时间可能都不同。
  • @Kerrek:但这无助于“每次运行程序时生成不同的随机数”!
  • @R.MartinhoFernandes:只为你,使用std::time(NULL) :-)
【解决方案2】:

试试这个:

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

您的程序启动时的某个地方(绝对不在您的 getrand() 函数中)。这将强制生成器每次启动时使用不同的种子。

【讨论】:

    【解决方案3】:

    你好像忘了打电话给srand

    【讨论】:

      【解决方案4】:

      伪随机数生成器在使用前需要“播种”;默认种子每次都是相同的,所以你得到相同的序列。

      通常您使用类似srand(time(NULL)) 的东西,但如果您在一秒钟内再次运行该程序,则会失败。

      在播种后用完一两个随机数也很好,因为前几个值与种子本身高度相关。

      【讨论】:

        【解决方案5】:

        随机化一次的简单解决方案是:

        int getrand(int min, int max) {
          static bool init = false;
        
          if (!init) {
            srand(time(NULL));
            init = true;
          }
        
          return rand()%(max-min)+min; 
        }
        

        【讨论】:

        • 在 C++ 中使用 int 作为布尔值,真的吗?此外,这可能会为其他不希望发生这种情况的序列重新初始化全局随机生成器。
        • 将其更改为 bool(在我的 µC 世界中)
        • 必须同意@KillianDS,最好在程序初始化的一个地方播种生成器,而不是让它被设置多次;如果他们都使用time(NULL) 作为种子,那么大多数时候你会得到一个重复序列。
        【解决方案6】:

        您需要启动种子。查看srand。另外,如果需要,请尝试 boost:

        boost::lagged_fibonacci607 base_prng(seed);
        boost::variate_generator<boost::lagged_fibonacci607&,boost::uniform_smallint<> > prng(base_prng,boost::uniform_smallint<>(min,max))
        

        【讨论】:

          猜你喜欢
          • 2014-07-06
          • 2016-07-05
          • 2020-08-10
          • 2015-01-22
          • 1970-01-01
          • 2017-11-03
          • 1970-01-01
          • 2012-11-19
          • 2014-12-19
          相关资源
          最近更新 更多