鱼C论坛

 找回密码
 立即注册
查看: 150|回复: 8

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

[复制链接]
发表于 2024-8-27 13:10:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
@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="")

感谢回复!
最佳答案
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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-27 13:14:34 | 显示全部楼层
FishC 发表于 2024-8-27 13:10
您好!对此代码提出一些修改建议和解答以下两个问题:

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

谢谢你!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-27 13:14:44 | 显示全部楼层


不客气!以下是修正后的代码,可以帮助解决提出的两个问题:
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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-27 13:55:15 | 显示全部楼层
什么叫错误地赋值呀,还是没有明白我这样写有什么问题,上面那个内部循环明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-27 13:56:08 | 显示全部楼层
FishC 发表于 2024-8-27 13:10
您好!对此代码提出一些修改建议和解答以下两个问题:

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

什么叫错误地赋值呀,还是没有明白我这样写有什么问题,上面那个内部循环明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

原来如此呀,非常感谢您!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-16 02:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表