【问题标题】:random number picker between 2 numbers2个数字之间的随机数字选择器
【发布时间】:2014-07-06 16:35:14
【问题描述】:

我正在使用 C++ 开发井字游戏,我想知道是否可以随机化一个数字,但它只能选择 2 或 5。

我在用户和计算机之间进行了随机启动,以便使用这些代码块进行公平启动:

 srand(time(NULL));
 cout << "The First Person to go is randomly chosen!" << endl;
 FirsttoGo = (rand()%2) + 1;
 cout << "The first move goes to Player: " << FirsttoGo << endl;
 turn = FirsttoGo;

我想添加的功能是,无论谁开始游戏,都可以选择 X 或 O,但如果计算机先启动,计算机应该能够在 X 或 O 之间进行选择。我还为X和O

static const int O = 5;
static const int X = 2;

有没有办法做到这一点?

【问题讨论】:

  • 不要为此使用rand()
  • 或许((int [2]){ 5, 2 })[rand() % 2]?
  • 25 的选择似乎相当随意。为什么不是更简单、更容易随机生成的东西,比如01

标签: c++ algorithm tic-tac-toe


【解决方案1】:
(rand() > RAND_MAX/2) ? 2 : 5;

【讨论】:

    【解决方案2】:

    在 C++11 中,为生成范围内的随机数提供了非常好的和更安全的附加功能(参见下面的代码):

    #include <random>
    #include <iostream>
    
    int main()
    {
        std::random_device rd;
        std::mt19937 gen(rd());
        std::uniform_int_distribution<> dis(1, 2);
        for (int n=0; n<10; ++n) std::cout << dis(gen) << ' ';
        std::cout << '\n';
    }
    

    此外,在此nice talk Stephan T. Lavavej 中说明了使用rand() 被认为有害的原因。

    根据上面的例子,你可以像这样针对你的问题进行调整:

    int getRandomIDX(int const a = 5, int const b = 2) {
      std::random_device rd;
      std::mt19937 gen(rd());
      std::uniform_int_distribution<> dis(1, 2);
      return (dis(gen) == 1)? a : b;
    }
    

    【讨论】:

    【解决方案3】:

    由于您只需要在两个值之间进行选择,因此您已经可以使用时间函数了

    time_t timer; 
    time(&timer); // it returns an integral value
    

    如果时间timer 甚至选择第一个,如果不选择第二个.. 这是真正的随机,而不是伪随机

    ...我猜有人讨厌简单之美。去 make random devicesdistributions 在 2 个值之间进行选择然后

    【讨论】:

    • 这不是真正的随机。它绝对没有熵。在同一秒内启动 20 个应用程序实例,它们都将输出相同的值。
    • @example 那是随机的,如果你能告诉我结果是什么,我可以给你一些权利。开始下午和其他事情或谁知道会发生什么。
    • 告诉我您开始的时间,我可以准确预测您的价值。真正的随机性只能以量子力学的方式获得,即使完全了解每个可观察量,结果在被测量之前仍然是未知的。 (人们经常不得不满足于(希望)没有被其他人观察到的事件所获得的“熵”——比如硬件中断——但即使这也不是真正的随机性)
    • 告诉我随机设备的种子,我还将预测生成器的输出。 “真正的”随机性是指玩家在任何给定时间玩游戏的选择
    【解决方案4】:

    这是选择随机编号的最快和最简单方法。 2个数字之间-

    srand(time(0));
    int t[2]={1,3}; //let two no. be 1 & 2
    int l= rand() % (2); //get 0 or 1
    cout<<t[l]<<endl;
    

    就是这样。干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      • 2015-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多