【问题标题】:Random Boolean Value [closed]随机布尔值
【发布时间】:2012-01-15 09:37:04
【问题描述】:

我正在尝试在 C++ 中生成一个 0 或 1 的随机 int。现在,每次运行此代码时我都会收到 0,但我不知道为什么。这里有什么问题?

#include <ctime>
#include <cstdlib>

srand(time(0));
int randomval = rand() % 2;
cout << randomval << endl;

【问题讨论】:

  • 你运行了多少次?
  • 尝试将最后两行放在一个循环中并打印多个值。
  • 它让我想起了一个抛硬币的 iPhone 应用。
  • 这个测试用例甚至无效;你没有功能块。所以你正在运行其他程序。连看都看不到怎么分析?

标签: c++ random ctime


【解决方案1】:

这叫倒霉。再试一次。

【讨论】:

  • 我在 for 循环中多次运行了 100 次。希望你是对的。
  • 您是否在每次迭代时都致电srand()?那么它应该一直保持相同的数字直到下一秒。
  • @RichByden,你认为time() 在这个循环中会改变多少次?
  • 你说得对,我真的不知道我在想什么。
  • @0605002,我明白了。这是名声;-)
【解决方案2】:

我知道这是一个较老的问题,但我相信这可以正确回答问题。

不要在每次运行该代码时重新播种生成器。

通过每次将其播种到相同的值,您将获得相同的“随机”数字。请记住,这是一个伪随机数生成器,因此将根据种子值生成一个“随机”数。因此,如果您每次都使用相同的号码播种,那么您每次都会得到相同的号码。

解决方案是在程序执行中只调用一次 srand(time(NULL)) 。然后,每次调用 rand() 都会给你一个不同的数字。

【讨论】:

    【解决方案3】:

    理论上,您有 50% 的机会获得 0 和 50 - 1。您可能想尝试使用不同的模数 - 例如 100,以检查这是否有效。我敢肯定。

    这段代码你只运行了几次,还不够。

    测试它的其他想法:

    srand(time(0));
    for( int i = 0; i < 1000000; ++i )
    {
        assert( 0 == ( rand() % 2 ) );
    }
    

    【讨论】:

    • -1:不要不要 srand循环!在你的程序开始时这样做,以后不要再这样做了。
    • @UncleBens - 因为@OP 不相信rand 返回(伪)随机值?
    【解决方案4】:

    我想补充一点,当您使用srand(time(0)); 时,“随机数”在同一秒内总是相同的。当我尝试运行您的程序 10000 次并按 uniq 对其进行分组时,我发现该数字不会在一秒钟内改变。

    for i in `seq 1 10000`; do ./a.out; done | uniq -c
        693 0
       3415 1
        675 0
        673 1
        665 0
        674 1
        668 0
        711 1
        694 0
        673 1
        459 0
    

    【讨论】:

      【解决方案5】:
      bool random() {
          if (rand() % 2 == 0)
              return true;
          else return false;
      }
      

      【讨论】:

      • 你为什么要测试然后返回你测试过的东西。请记住,如果您的 if 只有 return true 而您的 else 只有 return false,则最好只返回您正在测试的内容。即return rand() % 2 == 0;
      【解决方案6】:

      拨打srand(time(NULL)); 一次。

      然后使用这样的循环,这样你总是会得到 0 或 1。

      #include <stdio.h>
      #include <stdlib.h>
      
      srand(time(NULL));
      
      for (i=0;i<10;i++)
      {
          printf("%d\n",rand() % 2);
          i++;
      }
      
      return 0;
      

      【讨论】:

      • 也许添加一个解释 srand 需要被调用。
      【解决方案7】:

      虽然您的代码表明您希望以同样的可能性接收它们,但您并没有说明这一点,也许您只是认为不可能这样做。如果您想要一个不同的发行版,并且您愿意重写您的代码(并使其符合 C++11),您可以执行以下操作:

          const double chance = 0.3; // this is the chance of getting true, between 0 and 1;
          std::random_device rd;
          std::mt19937 mt(rd());
          std::bernoulli_distribution dist(chance);
          bool result = dist(mt);
      

      如果您需要在循环中执行此操作,只需重复最后一条语句dist(mt),保持所有生成的对象不变而不重新创建它们。

      【讨论】:

        【解决方案8】:

        你没有检查任何东西。使用:

        #include <ctime>
        #include <cstdlib>
        
        srand(time(0));
        int randomval = rand() % 2 == 0;
        cout << randomval << endl;
        

        【讨论】:

          猜你喜欢
          • 2017-09-05
          • 2016-08-13
          • 2023-03-28
          • 2011-10-13
          • 2012-07-13
          • 1970-01-01
          • 1970-01-01
          • 2013-10-12
          相关资源
          最近更新 更多