鱼C论坛

 找回密码
 立即注册
查看: 1484|回复: 10

找不到自己的错误在哪里 需要大家帮助

[复制链接]
发表于 2023-12-26 22:25:16 | 显示全部楼层 |阅读模式

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

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

x
python [课后作业] 第016讲:了不起的分支和循环(III)最后一题

需要更改抛硬币游戏 然后统计出现最多连续的数量。




以下是我的答案
import random

counts = int(input("请输入抛硬币的次数:"))
i = 0
x = 0
y = 0
j = 0
g = 0
c = 0
z = 0
h = 0
print("开始抛硬币实验:")
while i < counts:
    num = random.randint(1, 10)         

    if c % 2 and num % 2:
        j = j + 1
    else:
        if z < j:
           z = j
           j = 0
   
    if c % 2 != 0 and num % 2 != 0 :
        h = h + 1
    else:
        if g < h:
           g = h
           h = 0


    if num % 2:
        x = x + 1
        if counts <= 100:
            print("正面", end = ' ')
    else:
        y = y + 1
        if counts <= 100:
            print("反面", end = ' ')
            

    i += 1
    c = num
   
   
print("一共", x + y,"次硬币,结果如下")
print("正面:", x, "次")
print("反面:", y, "次")
print("连续正面:", z, "次")
print("连续反面:", g, "次")

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-26 22:25:31 | 显示全部楼层
在你的代码中,有几个问题需要注意:

1. 在抛硬币的实验中,你使用了`random.randint(1, 10)`来生成随机数,但是硬币只有两面,所以应该使用`random.randint(0, 1)`。

2. 在判断连续出现最多次数时,你使用了一个计数变量j和h,但是在每次判断之后都缺少将这些计数归零的步骤。你需要在条件分支后面添加`j = 0`和`h = 0`。

3. 在判断连续出现最多次数时,你使用了一个计数变量z和g来保存最大计数,但是它们的更新逻辑有问题。你需要将`if z < j:`和`if g < h:`的位置调换一下,这样才能正确地更新最大计数。

4. 最后,你没有在循环中更新计数变量c。你需要在循环结束前添加`c += 1`。

下面是修改后的代码:
import randomcounts = int(input("请输入抛硬币的次数:"))i = 0x = 0y = 0j = 0g = 0c = 0z = 0h = 0print("开始抛硬币实验:")while i < counts:    num = random.randint(0, 1)    if c % 2 and num % 2:        j += 1    else:        if z < j:            z = j        j = 0    if c % 2 != 0 and num % 2 != 0:        h += 1    else:        if g < h:            g = h        h = 0    if num % 2:        x += 1        i += 1    c += 1if z < j:    z = jif g < h:    g = hprint("正面出现次数:", x)print("最多连续正面次数:", z)print("最多连续反面次数:", g)
希望对你有帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-26 23:59:40 | 显示全部楼层
本帖最后由 jackz007 于 2023-12-27 09:21 编辑
import random
i = 0        # 循环变量
x = 0        # 正面
y = 0        # 反面
j = 0        # 连续正面计数
g = 0        # 最大连续反面
c = 0        # 上一次抛币的结果,奇数=正面,偶数=反面
z = 0        # 最大连续正面
h = 0        # 连续反面计数
counts = int(input("请输入抛硬币的次数:"))

# 先处理首次抛币
num = random . randint(1 , 2)
if num % 2 : j , x = 1 , 1
else : h , y = 1 , 1
i , c = 1 , num

#再处理后续抛币
while i < counts :
    num = random . randint(1 , 2)
    if num % 2 :         # 如果本次是正面
        if c % 2 :       # 如果上一次也是正面
            j += 1       # 连续正面计数值增加
        else :           # 否则,如果上一次是反面
            if h > g :   # 【注意这里】:条件更新最大反面计数记录值。
                g = h
            j = 1        # 初始化连续正面计数值为 1
        x += 1
    else :               # 否则,如果本次是反面
        if not (c % 2) : # 如果上一次也是反面
            h += 1       # 连续反面计数值增加
        else :           # 否则,如果上一次是正面
            if j > z :   # 【注意这里】:条件更新最大正面计数记录值
                z = j 
            h = 1        # 初始化连续反面计数值为 1
        y += 1
    c = num
    i += 1
    if counts <= 100 :
        print('正面') if num % 2 else print('反面')
print()
print("一共", x + y,"次硬币,结果如下")
print("正面:", x, "次")
print("反面:", y, "次")
print("连续正面:", z, "次")
print("连续反面:", g, "次")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-27 10:21:16 | 显示全部楼层
FishC 发表于 2023-12-26 22:25
在你的代码中,有几个问题需要注意:

1. 在抛硬币的实验中,你使用了`random.randint(1, 10)`来生成随机数 ...

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

使用道具 举报

发表于 2023-12-27 10:21:28 | 显示全部楼层

非常抱歉,我在给出代码示例时犯了一个错误。你可以尝试以下修正的代码:
import randomcounts = int(input("请输入抛硬币的次数:"))i = 0x = 0max_consecutive_heads = 0max_consecutive_tails = 0current_consecutive_heads = 0current_consecutive_tails = 0print("开始抛硬币实验:")while i < counts:    num = random.randint(0, 1)    if num == 0:  # 正面        x += 1        current_consecutive_heads += 1        current_consecutive_tails = 0        max_consecutive_heads = max(max_consecutive_heads, current_consecutive_heads)    else:  # 反面        current_consecutive_heads = 0        current_consecutive_tails += 1        max_consecutive_tails = max(max_consecutive_tails, current_consecutive_tails)    i += 1print("正面出现次数:", x)print("最多连续正面次数:", max_consecutive_heads)print("最多连续反面次数:", max_consecutive_tails)
这段代码将记录连续出现的正面次数和反面次数,并找到其中的最大值。希望这次能够满足你的需求!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-27 10:25:51 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-27 10:25:56 | 显示全部楼层

不客气,很高兴能够帮到你!如果还有其他问题或者需要进一步的帮助,请随时提问。编程的世界充满了乐趣和挑战,我都会竭尽全力为你解答。祝你学习编程的路上一帆风顺,笑口常开!哈哈哈!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-27 10:53:21 | 显示全部楼层

实在不好意思
第12行代码 到第16行代码 是因为他是缩写 然后我没有看懂 刚刚开始学python 可以麻烦讲解一下吗 谢谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-27 10:53:30 | 显示全部楼层
shangshuai 发表于 2023-12-27 10:53
实在不好意思
第12行代码 到第16行代码 是因为他是 ...

当然可以!让我们一起来解释这几行代码。

在第12行至第16行的代码片段中,我们使用了一个常见的编程技巧,即条件语句和三元表达式的结合。这种语法结构可以简洁地表达一个条件判断,并根据判断结果返回不同的值。

让我们来逐行解释:
j += 1 if c % 2 and num % 2 else 0
这行代码可以被理解为:
如果 `c` 是奇数并且 `num` 是奇数,则 `j` 自增1;否则不执行任何操作(即返回0)。

这行代码等效于以下代码块:
if c % 2 and num % 2:      j += 1else:    pass  # 不执行任何操作
h += 1 if c % 2 != 0 and num % 2 != 0 else 0
这行代码可以被理解为:
如果 `c` 不是偶数并且 `num` 不是偶数,则 `h` 自增1;否则不执行任何操作(即返回0)。

这行代码等效于以下代码块:
if c % 2 != 0 and num % 2 != 0:    h += 1else:    pass  # 不执行任何操作
希望这样解释清楚了这几行代码的含义。有了这个解释,你应该能更好地理解这部分代码的逻辑。如果还有其他问题,请随时提问,我会尽力帮助你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-27 14:50:47 | 显示全部楼层
本帖最后由 jackz007 于 2023-12-27 15:00 编辑
shangshuai 发表于 2023-12-27 10:53
实在不好意思
第12行代码 到第16行代码 是因为他是缩写 然后我没有看懂 刚刚开始学python 可以麻烦讲解 ...


     1、为什么要写12-16行代码?
          因为在 while 内每次循环都需要根据上一次和本次抛币的结果进行判断,如果去掉 12-16 行代码直接进入循环,那么,在循环内首次判断正反面的时候,会因为 c 的值为 0,而被误解为上一次抛币的结果是反面。这显然是错误的。所以,写 12-16 行代码的目的,就是在开始循环前,为变量 c 准备一个正常的数值。
          此外,还因为首次抛币的代码逻辑与在循环内后续抛币的代码逻辑完全不同,所以,才会把这些(12-16行)代码单列在循环开始之前。
   
     2、如果 12-16 行代码看不懂,可以换一个写法:
# 先处理首次抛币
num = random . randint(1 , 2)
if num % 2 :  # 如果首次抛币是正面
    j = 1     # 初始化连续正面计数值为 1
    x = 1     # 初始化正面计数值为 1
else :        # 否则,如果首次抛币是反面
    h = 1     # 初始化连续反面计数值为 1
    y = 1     # 初始化反面计数值为 1
i = 1         # 初始化循环变量值为 1
c = num       # 将首次抛币结果记录在变量 c 中,准备进入循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-12-27 16:21:35 | 显示全部楼层
from random import randint


class Coin:
    def __init__(self):
        self.allcount = 0

        self.face_count = {}  # 统计硬币正面连续
        self.rear_count = {}  # 统计硬币反面连续
        self.face = 0  # 连续的正面次数
        self.rear = 0  # 连续的反面次数

    # 抛一次硬币
    def get_coin(self):
        x = randint(0, 1)
        self.allcount += 1
        if x:
            self.rear = 0  # 如果为正面则清空反面次数
            self.face_count[self.face] = self.face_count.get(self.face, 0) - 1  # 前任次数-1
            self.face += 1  # 连续的正面次数+1
            self.face_count[self.face] = self.face_count.get(self.face, 0) + 1  # 新欢次数+1
        else:
            self.face = 0
            self.rear_count[self.rear] = self.rear_count.get(self.rear, 0) - 1  # 前任次数-1
            self.rear += 1
            self.rear_count[self.rear] = self.rear_count.get(self.rear, 0) + 1  # 新欢次数+1

    def show_coin(self):
        face = {x: self.face_count[x] for x in self.face_count if self.face_count[x] > 0}
        rear = {x: self.rear_count[x] for x in self.rear_count if self.rear_count[x] > 0}
        print("正面的统计数据为:", face)
        print("反面的统计数据为:", rear)
        print("抛硬币总次数为:",self.allcount)



a = Coin()

# 抛500次
for i in range(500):
    a.get_coin()

# 打印结果
a.show_coin()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-14 15:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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