鱼C论坛

 找回密码
 立即注册
查看: 1723|回复: 5

[已解决]新版Python16讲课后作业的最后一题

[复制链接]
发表于 2021-1-14 01:01:26 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 镜花丿水月 于 2021-1-15 00:32 编辑

我自己敲出来了但是不确定自己敲的是不是完全对的,所以希望大家能帮忙看一下有没有逻辑错误的地方。
自己检查的时候是对的。
另外,小甲鱼每次判断投掷硬币的正反面的时候,都是取(1,10)的随机整数然后除以2判断余数。
而我是直接取(1,2)随机整数判断正反面。1为正 2为反。请教下,这2种方法有什么本质上的区别吗?

自己写的代码如下

import random

i = input('请输入抛硬币的次数:')
i = int(i)
print('开始抛硬币实验')

count = 1
a = 0
b = 0
c = 0
c_sub = 0
d = 0
d_sub = 0
result_sub = 0
if i <= 100:
    while count <= i:
        result = random.randint(1,2)
        if result != result_sub:
            c_sub = 1
            d_sub = 1
        else:
            if c < c_sub:
                c = c_sub
            elif d < d_sub:
                d = d_sub
               
        result_sub = result
        count += 1
        if result == 1:
            print('正面',end='')
            a += 1
            c_sub += 1
        else:
            print('反面',end='')
            b += 1
            d_sub += 1
        
else:
    while count <= i:
        result = random.randint(1,2)
        if result != result_sub:
            c_sub = 1
            d_sub = 1
        else:
            if c < c_sub:
                c = c_sub
            elif d < d_sub:
                d = d_sub
               
        result_sub = result
        count += 1
        if result == 1:
            a += 1
            c_sub += 1
        else:
            b+= 1
            d_sub += 1
            
print('一共模拟了',i,'次抛硬币,结果如下:')
print('正面:',a,'次')
print('反面:',b,'次')
print('最多连续正面:',c,'次')
print('最多连续反面:',d,'次')

结果如下:
最佳答案
2021-1-15 08:27:41
  1. '''
  2. 楼主写的应该是没问题的,但是感觉比较乱
  3. 我自己刚刚敲了一个
  4. 楼主可以看看是不是有帮助
  5. 给楼主个建议
  6. 还是少用abcd这种变量
  7. 记不住谁是谁
  8. '''

  9. import random
  10. num = int(input('请输入抛硬币的次数:'))
  11. print('开始抛硬币实验')

  12. #将数据用列表存储
  13. # up 和 1 表示正面
  14. # down 和 2 表示反面
  15. # [1,0,0]分别表示[正面,正面次数,正面最大连续次数]
  16. list_up = [1,0,0]
  17. list_down = [2,0,0]

  18. #循环内临时变量,用于判断
  19. max_up = max_down = 0

  20. for i in range(num):
  21.     random_num = random.randint(1,2)
  22.    
  23.     if random_num == list_up[0]:
  24.         list_up[1] += 1
  25.         max_up += 1
  26.         max_down = 0
  27.         #如果随机数为1则正面次数加一
  28.         #正面连续次数加一
  29.         #反面连续次数清零
  30.         if max_up >=list_up[2]:
  31.             list_up[2] = max_up
  32.             #如果正面连续次数大于等于已记录列表内最大连续次数
  33.             #则更正列表内最大连续次数

  34.     #以下相同   
  35.     elif random_num == list_down[0]:
  36.         list_down[1] += 1
  37.         max_down += 1
  38.         max_up = 0
  39.         if max_down >=list_down[2]:
  40.             list_down[2] = max_down
  41.             
  42. print('一共模拟了',num,'次抛硬币,结果如下:')
  43. print('正面:',list_up[1],'次')
  44. print('反面:',list_down[1],'次')
  45. print('最多连续正面:',list_up[2],'次')
  46. print('最多连续反面:',list_down[2],'次')
复制代码
微信图片_20210114010115.png
微信图片_202101140101151.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-1-15 00:32:53 | 显示全部楼层
没有大佬么=。=  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-15 01:01:47 | 显示全部楼层
没仔细看你的代码,但是这道题的意思就是获取两个不同的值进行判断正面或者反面。

比如小甲鱼的1,10取2的余数,只会存在 0 和 1 这两种可能

当然你也可以用0, 100 取值,0-49 为正面,50 - 100 为反面

你自己的方法也是可以的,无非就是模拟硬币的双面投掷。并没觉得有什么实质性的差距,每一种方式,只要你能保证两面的可能性都为 50% 就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-1-15 08:27:41 | 显示全部楼层    本楼为最佳答案   
  1. '''
  2. 楼主写的应该是没问题的,但是感觉比较乱
  3. 我自己刚刚敲了一个
  4. 楼主可以看看是不是有帮助
  5. 给楼主个建议
  6. 还是少用abcd这种变量
  7. 记不住谁是谁
  8. '''

  9. import random
  10. num = int(input('请输入抛硬币的次数:'))
  11. print('开始抛硬币实验')

  12. #将数据用列表存储
  13. # up 和 1 表示正面
  14. # down 和 2 表示反面
  15. # [1,0,0]分别表示[正面,正面次数,正面最大连续次数]
  16. list_up = [1,0,0]
  17. list_down = [2,0,0]

  18. #循环内临时变量,用于判断
  19. max_up = max_down = 0

  20. for i in range(num):
  21.     random_num = random.randint(1,2)
  22.    
  23.     if random_num == list_up[0]:
  24.         list_up[1] += 1
  25.         max_up += 1
  26.         max_down = 0
  27.         #如果随机数为1则正面次数加一
  28.         #正面连续次数加一
  29.         #反面连续次数清零
  30.         if max_up >=list_up[2]:
  31.             list_up[2] = max_up
  32.             #如果正面连续次数大于等于已记录列表内最大连续次数
  33.             #则更正列表内最大连续次数

  34.     #以下相同   
  35.     elif random_num == list_down[0]:
  36.         list_down[1] += 1
  37.         max_down += 1
  38.         max_up = 0
  39.         if max_down >=list_down[2]:
  40.             list_down[2] = max_down
  41.             
  42. print('一共模拟了',num,'次抛硬币,结果如下:')
  43. print('正面:',list_up[1],'次')
  44. print('反面:',list_down[1],'次')
  45. print('最多连续正面:',list_up[2],'次')
  46. print('最多连续反面:',list_down[2],'次')
复制代码

评分

参与人数 1鱼币 +5 收起 理由
我要先python + 5 鱼C有你更精彩^_^

查看全部评分

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

使用道具 举报

 楼主| 发表于 2021-1-17 23:25:19 | 显示全部楼层
Daniel_Zhang 发表于 2021-1-15 01:01
没仔细看你的代码,但是这道题的意思就是获取两个不同的值进行判断正面或者反面。

比如小甲鱼的1,10取2 ...

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

使用道具 举报

 楼主| 发表于 2021-1-17 23:26:26 | 显示全部楼层

回复得好详细~~~谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 13:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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