shangshuai 发表于 2023-12-26 22:25:16

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

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, "次")

FishC 发表于 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 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(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 += 1

if z < j:
    z = j
if g < h:
    g = h

print("正面出现次数:", x)
print("最多连续正面次数:", z)
print("最多连续反面次数:", g)

希望对你有帮助!

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

jackz007 发表于 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, "次")

shangshuai 发表于 2023-12-27 10:21:16

FishC 发表于 2023-12-26 22:25
在你的代码中,有几个问题需要注意:

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

不对啊

FishC 发表于 2023-12-27 10:21:28

shangshuai 发表于 2023-12-27 10:21
不对啊

非常抱歉,我在给出代码示例时犯了一个错误。你可以尝试以下修正的代码:

import random

counts = int(input("请输入抛硬币的次数:"))
i = 0
x = 0
max_consecutive_heads = 0
max_consecutive_tails = 0
current_consecutive_heads = 0
current_consecutive_tails = 0

print("开始抛硬币实验:")
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 += 1

print("正面出现次数:", x)
print("最多连续正面次数:", max_consecutive_heads)
print("最多连续反面次数:", max_consecutive_tails)

这段代码将记录连续出现的正面次数和反面次数,并找到其中的最大值。希望这次能够满足你的需求!如果还有其他问题,请随时提问。

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

shangshuai 发表于 2023-12-27 10:25:51

jackz007 发表于 2023-12-26 23:59


谢谢啦哈哈哈

FishC 发表于 2023-12-27 10:25:56

shangshuai 发表于 2023-12-27 10:25
谢谢啦哈哈哈

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

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

shangshuai 发表于 2023-12-27 10:53:21

jackz007 发表于 2023-12-26 23:59


实在不好意思
第12行代码 到第16行代码 是因为他是缩写 然后我没有看懂 刚刚开始学python 可以麻烦讲解一下吗 谢谢啦

FishC 发表于 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 += 1
else:
    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 += 1
else:
    pass# 不执行任何操作

希望这样解释清楚了这几行代码的含义。有了这个解释,你应该能更好地理解这部分代码的逻辑。如果还有其他问题,请随时提问,我会尽力帮助你!

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

jackz007 发表于 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 中,准备进入循环

qq575633247 发表于 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_count.get(self.face, 0) - 1# 前任次数-1
            self.face += 1# 连续的正面次数+1
            self.face_count = self.face_count.get(self.face, 0) + 1# 新欢次数+1
      else:
            self.face = 0
            self.rear_count = self.rear_count.get(self.rear, 0) - 1# 前任次数-1
            self.rear += 1
            self.rear_count = self.rear_count.get(self.rear, 0) + 1# 新欢次数+1

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



a = Coin()

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

# 打印结果
a.show_coin()
页: [1]
查看完整版本: 找不到自己的错误在哪里 需要大家帮助