C语言 如何在一个循环中得到随机数?[已关闭]

ndh0cuux  于 2023-10-16  发布在  其他
关注(0)|答案(3)|浏览(103)

已关闭此问题为not reproducible or was caused by typos。它目前不接受回答。

此问题是由打印错误或无法再重现的问题引起的。虽然类似的问题可能是on-topic在这里,这一个是解决的方式不太可能帮助未来的读者。
25天前关闭
Improve this question
附件是我的骰子游戏的代码。我得到玩家100%的胜利,因为我的兰德()在所有1,000,000场比赛中调用相同的数字。我已经看到很多人发布关于这个问题的帖子,每个人都说只给srand打一次电话,但我想我不明白这意味着什么。这是我在C的第六周,它开始变得非常混乱。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define numGames (1000000)
#define plrWinThrw (7, 11)
#define hseWinThrw (2, 3, 12)

int rollDice ();
int playGame ();

int main ()
{
  srand (time (NULL));
  int playerWins = 0;
  int houseWins = 0;

  for (int i = 0; i < numGames; i++)
    {
      int result = playGame ();
      if (result == 1)
        {
          playerWins++;
        }
      else
        {
          houseWins++;
        }
    }

  float playerProb = (float) playerWins / numGames * 100;
  float houseProb = (float) houseWins / numGames * 100;

  printf ("Number of games won by the player: %d\n", playerWins);
  printf ("Number of games won by the house: %d\n", houseWins);
  printf ("Percent probability the player wins: %.1lf\n", playerProb);
  printf ("Percent probability the house wins: %.1lf\n", houseProb);

  return 0;
}

int rollDice ()
{
  int die1 = rand () % 6 + 1;
  int die2 = rand () % 6 + 1;
  int roll = die1 + die2;
  return roll;
}

int playGame ()
{
  int roll = rollDice ();

  if (roll = plrWinThrw)
    {
      return 1;
    }
  else if (roll = hseWinThrw)
    {
      return -1;
    }
  int point = roll;
  while (roll != point && roll != 7)
    {
      roll = rollDice ();
    }
  if (roll = point)
    {
      return 1;
    }
  return -1;
}

我试过移动srand和rand()函数。似乎没有什么能解决我的问题。

hts6caw3

hts6caw31#

在if语句中使用赋值运算符=而不是比较运算符==
当您写入if (roll = plrWinThrw)时,它将plrWinThrw分配给roll,而不是将rollplrWinThrw进行比较。为了正确地比较它们,您需要编写if (roll == plrWinThrw)

hkmswyz6

hkmswyz62#

正确使用随机数-调用srand一次,使用种子,然后调用rand。
你的问题似乎是你的if语句,他们不做你认为他们做的事情:你混淆了赋值(=)和比较(==x=1是一个赋值。它使x保持值1,并且语句的计算结果为1(如果在if语句中使用,则计为true)。x之前的值是多少并不重要!另一方面,x==1不会改变x的值。如果x的值为1,则返回true值。这是你通常想在if语句中使用的。
虽然这是一个容易犯的错误,甚至可能是一个错别字,但有一种系统的方法可以防止这种错误:使用编译器警告,它们会告诉你这类误导性代码。在gcc/clang上,-Wall-选项可以完成任务,其他编译器也有等效的选项。

lokaqttq

lokaqttq3#

我看到很多人发布关于这个问题的帖子,每个人都说只调用srand一次,但我想我不明白这意味着什么。
srand中的s代表seed。它是你给予给 * 伪随机数生成器 * 的初始值。可以说,这是它的起点。
它是伪的,因为它根本不是随机的。rand生成一个数字序列号,每次你给它给予相同的种子时,它都是 * 完全 * 相同的(在你使用的库的特定版本中--rand中使用的实际公式不是标准化的)。

相关问题