【问题标题】:Can I specify conditions for the rand() function?我可以为 rand() 函数指定条件吗?
【发布时间】:2020-04-25 07:22:33
【问题描述】:

我想生成一个介于 1 到 6 之间的随机数(我知道怎么做),但不等于 4 个其他变量(例如,它们的名称是“num1”、“ num2”、“num3”和“num4”)。我可以这样做吗?如何?

【问题讨论】:

  • 让我看看我是否理解...你想要四个变量,每个变量都有一个介于 1 和 6(含)之间的随机值,但没有重复?
  • 你可以这样做。一种解决方案是有两个循环。外循环为每个变量设置一个随机值;内部循环检查随机值是否重复。
  • 或者洗牌数组{1, 2, 3, 4, 5, 6}并取前四个值。
  • @Oona 为什么复杂?您可以检查您的值是否不等于任何其他随机值,如果它们相等,则生成另一个随机数。
  • 我不知道你在课堂上学到了什么,但是shuffle isn't hard to implement

标签: c random random-seed


【解决方案1】:

这个问题(目前)不清楚,但来自 cmets 的澄清:

您需要四个变量,每个变量都有一个介于 1 和 6 之间的随机值 (含),但没有重复?

假设实际上您需要 5 个变量,因为问题指出:

不会等于 4 个其他变量

因为您需要来自 6 种可能性的 5 个唯一变量。最简单的解决方案是随机选择一种可能性来省略。此外,存储 5 个相同类型的值的明智 方法是使用单个 数组变量 而不是五个单独的变量 - 它使代码更简单。

int num[5] ;
int omit = 1 + rand() % 6 ;
for( int i = 0, j = 0; i < sizeof(num) / sizeof(*num); i++, j++ )
{
    if( i != omit ) num[j] = i ;
}

请注意,即使rand() 是完全随机的,表达式1 + rand() % 6 也会对某些值产生偏差。如果这是一个问题,读者可以做一个练习。

【讨论】:

  • 1 + std::rand() / ((RAND_MAX + 1u) / 6) 可以生成 [1...7]。例如rand() == 2147483647, RAND_MAX == 2147483647 --> 7. 对于这样的学习者代码,1 + std::rand()%6 就足够了。
  • 我看不出你是如何从中得到 7 的(当正确应用运算符优先级时)。我同意 %6 就足够了,但试图避免来自学究的关于偏见的 cmets。这就是为什么我要求 OP 包括他的方法,以便他决定其重要性。
  • 重新思考的聪明方法,随机选择要省略而不是包含的数字。
  • "你如何得到 7" : (2147483647 + 1u)/6 --> 357913941. 2147483647/357913941 --> 6. 1 + 6 --> 7.
  • @chux-ReinstateMonica :我知道你必须是对的——需要更多的咖啡。回滚到原始文本。如果有人有兴趣应该是int omit ; do{ omit = 1 + std::rand() / ((RAND_MAX + 1u) / 6)} while( omit &lt; 7 );
猜你喜欢
  • 2017-03-09
  • 1970-01-01
  • 2021-06-17
  • 2013-07-18
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 2013-11-22
  • 2010-10-29
相关资源
最近更新 更多