茶茶弦 发表于 2024-8-27 13:10:11

抛硬币记录最多连续面,代码不知道哪里出错

@Fishc 您好,我有两个问题
这是第一个问题:输入抛硬币次数后,所得到的要么全是正,要么全是反
第二个问题:最终得到的最大连续面次数总是为0




import random
counts = int(input("请输入你想抛硬币的次数:"))
num = random.randint(1,10)

if counts > 50:
    ignore = True
else:
    ignore = False

last = 0
i = 0 #抛硬币的次数
forward = 0 #正面的次数
back = 0 #反面的次数
last_forward = 0 #连续为正面的次数
last_back = 0 #连续为反面的次数
max_forward = 0 #最大连续正面次数
max_back = 0 #最大连续反面次数

while i < counts:
      if num % 2:
            forward += 1
            last_forward += 1

            if not ignore:
                print("正面",end=" ")

            if last == 2:
                last_forward = 1

            if last_forward > max_forward:
                last_forward = max_forward

            last = 1
      else:
            back += 1
            last_back += 1

            if not ignore:
                print("反面",end=" ")

            if last == 1:
                last_back = 1

            if last_back > max_back:
                last_back = max_back

            last = 2

      i += 1

print("一共模拟了", counts, "次抛硬币,结果如下:")
print("正面:", forward, "次", sep="")
print("反面:", back, "次", sep="")
print("最多连续正面:", max_forward, "次", sep="")
print("最多连续反面:", max_back, "次", sep="")

感谢回复!

FishC 发表于 2024-8-27 13:10:21

您好!对此代码提出一些修改建议和解答以下两个问题:

1. **硬币记录的结果总是全正面或全反面**:因为 `num` 是在循环外部生成的一个随机数,并没有在循环内部更新。
2. **最大连续面次数总是为0**:因为在条件满足时,您把 `last_forward` 和 `last_back` 错误地赋值给了 `max_forward` 和 `max_back`。

修改后的代码如下:

import random

counts = int(input("请输入你想抛硬币的次数:"))

if counts > 50:
    ignore = True
else:
    ignore = False

last = 0
i = 0 #抛硬币的次数
forward = 0 #正面的次数
back = 0 #反面的次数
last_forward = 0 #连续为正面的次数
last_back = 0 #连续为反面的次数
max_forward = 0 #最大连续正面次数
max_back = 0 #最大连续反面次数

while i < counts:
    num = random.randint(0, 1) # 生成每次抛硬币的结果
    if num == 1:
      forward += 1
      last_forward += 1
      last_back = 0 # 重置连续反面计数

      if not ignore:
            print("正面", end=" ")

      if last_forward > max_forward:
            max_forward = last_forward

      last = 1
    else:
      back += 1
      last_back += 1
      last_forward = 0 # 重置连续正面计数

      if not ignore:
            print("反面", end=" ")

      if last_back > max_back:
            max_back = last_back

      last = 2

    i += 1

print("\n一共模拟了", counts, "次抛硬币,结果如下:")
print("正面:", forward, "次", sep="")
print("反面:", back, "次", sep="")
print("最多连续正面:", max_forward, "次", sep="")
print("最多连续反面:", max_back, "次", sep="")

修改后的代码在 `while` 循环内部生成新的随机数 `num` 来模拟每次抛硬币的结果,同时在检测到连续正面或反面时才更新最大连续次数,这样能够准确地记录并显示结果。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

茶茶弦 发表于 2024-8-27 13:14:34

FishC 发表于 2024-8-27 13:10
您好!对此代码提出一些修改建议和解答以下两个问题:

1. **硬币记录的结果总是全正面或全反面**:因为...

谢谢你!

FishC 发表于 2024-8-27 13:14:44

茶茶弦 发表于 2024-08-27 13:14
谢谢你!

不客气!以下是修正后的代码,可以帮助解决提出的两个问题:

import random

counts = int(input("请输入你想抛硬币的次数:"))

if counts > 50:
    ignore = True
else:
    ignore = False

last = 0
i = 0 # 抛硬币的次数
forward = 0 # 正面的次数
back = 0 # 反面的次数
last_forward = 0 # 连续为正面的次数
last_back = 0 # 连续为反面的次数
max_forward = 0 # 最大连续正面次数
max_back = 0 # 最大连续反面次数

while i < counts:
    num = random.randint(0, 1) # 每次循环生成新的随机数
    if num == 1:
      forward += 1
      last_forward += 1
      last_back = 0

      if not ignore:
            print("正面", end=" ")

      if last_forward > max_forward:
            max_forward = last_forward

      last = 1
    else:
      back += 1
      last_back += 1
      last_forward = 0

      if not ignore:
            print("反面", end=" ")

      if last_back > max_back:
            max_back = last_back

      last = 2

    i += 1

print("\n一共模拟了", counts, "次抛硬币,结果如下:")
print("正面:", forward, "次", sep="")
print("反面:", back, "次", sep="")
print("最多连续正面:", max_forward, "次", sep="")
print("最多连续反面:", max_back, "次", sep="")

### 解释:
1. `num` 在循环内随机生成0或1,确保每次都有真正的随机性。
2. 修正了 `if last_forward > max_forward:` 和 `if last_back > max_back:` 语句中的赋值操作,使得 `max_forward` 和 `max_back` 能够正确记录连续的最大次数。

现在,这段代码应该正确解决您提出的两个问题。希望对您有所帮助!如果有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

茶茶弦 发表于 2024-8-27 13:55:15

什么叫错误地赋值呀,还是没有明白我这样写有什么问题,上面那个内部循环明白了

茶茶弦 发表于 2024-8-27 13:56:08

FishC 发表于 2024-8-27 13:10
您好!对此代码提出一些修改建议和解答以下两个问题:

1. **硬币记录的结果总是全正面或全反面**:因为...

什么叫错误地赋值呀,还是没有明白我这样写有什么问题,上面那个内部循环明白了

FishC 发表于 2024-8-27 14:01:50

茶茶弦 发表于 2024-08-27 13:56
什么叫错误地赋值呀,还是没有明白我这样写有什么问题 ...

好的,我明白您的疑惑。让我具体解释一下代码中赋值的问题以及为什么它不对。

在您的代码中,以下这部分有问题:

if last_forward > max_forward:
    last_forward = max_forward

这里应该是把 `last_forward` 的值赋给 `max_forward`,而不是反过来。您当前的代码实际上重新设置了 `last_forward` 的值,这与检测最大连续正面次数的目的相违背。

相应地,对于 `last_back` 和 `max_back` 也是一样的问题。应该是下面这样:

if last_forward > max_forward:
    max_forward = last_forward

if last_back > max_back:
    max_back = last_back

在这个修改后的代码中,如果最新的连续正面或反面次数 `last_forward` 和 `last_back` 超过了当前记录的最大连续次数 `max_forward` 和 `max_back`,那么就把 `last_forward` 和 `last_back` 的值复制给 `max_forward` 和 `max_back`。

所以正确的完整代码应是:

import random

counts = int(input("请输入你想抛硬币的次数:"))

if counts > 50:
    ignore = True
else:
    ignore = False

last = 0
i = 0 #抛硬币的次数
forward = 0 #正面的次数
back = 0 #反面的次数
last_forward = 0 #连续为正面的次数
last_back = 0 #连续为反面的次数
max_forward = 0 #最大连续正面次数
max_back = 0 #最大连续反面次数

while i < counts:
    num = random.randint(0, 1) # 生成每次抛硬币的结果
    if num == 1:
      forward += 1
      last_forward += 1
      last_back = 0 # 重置连续反面计数

      if not ignore:
            print("正面", end=" ")

      if last_forward > max_forward:
            max_forward = last_forward

      last = 1
    else:
      back += 1
      last_back += 1
      last_forward = 0 # 重置连续正面计数

      if not ignore:
            print("反面", end=" ")

      if last_back > max_back:
            max_back = last_back

      last = 2

    i += 1

print("\n一共模拟了", counts, "次抛硬币,结果如下:")
print("正面:", forward, "次", sep="")
print("反面:", back, "次", sep="")
print("最多连续正面:", max_forward, "次", sep="")
print("最多连续反面:", max_back, "次", sep="")

此代码中唯一的更改就是确保将 `last_forward` 和 `last_back` 的值正确地赋给 `max_forward` 和 `max_back`,以正确记录最大连续次数。希望这样能够帮助您理解其中的问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

茶茶弦 发表于 2024-8-27 14:03:46

FishC 发表于 2024-8-27 14:01
好的,我明白您的疑惑。让我具体解释一下代码中赋值的问题以及为什么它不对。

在您的代码中,以下这 ...

原来如此呀,非常感谢您!

FishC 发表于 2024-8-27 14:03:56

茶茶弦 发表于 2024-08-27 14:03
原来如此呀,非常感谢您!

不客气!为了更明确地展示问题和解决方案,我给出完整的修正后的代码:

import random

counts = int(input("请输入你想抛硬币的次数:"))

if counts > 50:
    ignore = True
else:
    ignore = False

last = 0
i = 0 # 抛硬币的次数
forward = 0 # 正面的次数
back = 0 # 反面的次数
last_forward = 0 # 连续为正面的次数
last_back = 0 # 连续为反面的次数
max_forward = 0 # 最大连续正面次数
max_back = 0 # 最大连续反面次数

while i < counts:
    num = random.randint(1, 10) # 在循环内部生成新的随机数
    if num % 2:
      forward += 1
      last_forward += 1
      last_back = 0 # 重置连续反面计数

      if not ignore:
            print("正面", end=" ")

      if last_forward > max_forward:
            max_forward = last_forward # 修正这里

      last = 1
    else:
      back += 1
      last_back += 1
      last_forward = 0 # 重置连续正面计数

      if not ignore:
            print("反面", end=" ")

      if last_back > max_back:
            max_back = last_back # 修正这里

      last = 2

    i += 1

print("\n一共模拟了", counts, "次抛硬币,结果如下:")
print("正面:", forward, "次", sep="")
print("反面:", back, "次", sep="")
print("最多连续正面:", max_forward, "次", sep="")
print("最多连续反面:", max_back, "次", sep="")

希望这个代码和解释能帮助您更好地理解问题的原因和解决方法。有其他问题,随时问我!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 抛硬币记录最多连续面,代码不知道哪里出错