鱼C论坛

 找回密码
 立即注册
查看: 3753|回复: 27

[已解决]关于连续最先最多硬币次数的逻辑思考问题

[复制链接]
发表于 2020-12-9 08:16:53 | 显示全部楼层 |阅读模式

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

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

x
现将不懂的问题罗列如下:
①,为什么会想出要假设一个变量“ignore”来判断是否打印每次的结果?因为我怎么想都想不出来?

②,if counts > 100:#为什么要写出这样形式的代码?为什么会确定数字是100?
             ignore = True#为什么要用True 和 False 的形式,并且还要将 True 和 False 的值赋值给变量ignore?

      else:
            ignore = False

、关于引入的变量last ,在代码的运行中,到底是怎么运行的,为什么可以假设last == 1 或者 last == 2 呢?

④、关于判断连续出现最多次数的逻辑我也不是很懂?

if num % 2:
        heads += 1
        c_heads += 1

        if not ignore:    ## 为什么突然就是 if not   ignore ,我不明白的是这个判断语句是判断的什么呀?
            print("正面", end=" ")

        # 如果上一次是反面:将连续正面的次数设置为1##为什么要这样写?
        if last == 2:
            c_heads = 1

        # 判断连续正面的次数是否比max_heads大,如果是,取而代之
        if c_heads > max_heads:
            max_heads = c_heads

        # 将上一次的状态设置为正面##为什么要这样写?
        last = 1
    else:
        tails += 1
        c_tails += 1
        
        if not ignore: ## 为什么突然就是 if not   ignore ,我不明白的是这个判断语句是判断的什么呀?
            print("反面", end=" ")

        # 如果上一次是正面:连续反面的次数设置为1##为什么要这样写?
        if last == 1:
            c_tails = 1

        # 判断连续反面的次数是否比max_tails大,如果是,取而代之
        if c_tails > max_tails:
            max_tails = c_tails

        # 将上一次的状态设置为反面##为什么要这样写?
        last = 2

⑤、这次的问题有点多,因为确实看不懂这个代码的逻辑,麻烦各位大神耐心解答下,谢谢啦!!!



完整的代码罗列如下:
import random

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

# 利用 ignore 变量来判断是否打印每次的结果
if counts > 100:
    ignore = True
else:
    ignore = False

heads = 0 # 统计正面的次数
tails = 0 # 统计反面的次数

last = 0 # 记录上一次的状态,如果是正面设置为1, 反面则设置为2
c_heads = 0 # 统计连续正面的次数
c_tails = 0 # 统计连续反面的次数
max_heads = 0 # 统计连续正面的最多次数
max_tails = 0 # 统计连续反面的最多次数

i = 0
print("开始抛硬币实验……")
while i < counts:
    num = random.randint(1, 10)

    if num % 2:
        heads += 1
        c_heads += 1

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

        # 如果上一次是反面:将连续正面的次数设置为1
        if last == 2:
            c_heads = 1

        # 判断连续正面的次数是否比max_heads大,如果是,取而代之
        if c_heads > max_heads:
            max_heads = c_heads

        # 将上一次的状态设置为正面
        last = 1
    else:
        tails += 1
        c_tails += 1
        
        if not ignore:
            print("反面", end=" ")

        # 如果上一次是正面:连续反面的次数设置为1
        if last == 1:
            c_tails = 1

        # 判断连续反面的次数是否比max_tails大,如果是,取而代之
        if c_tails > max_tails:
            max_tails = c_tails

        # 将上一次的状态设置为反面
        last = 2
        
    i += 1

print("")
print("一共模拟了", counts, "次抛硬币,结果如下:")
print("正面:", heads, "次", sep="")
print("反面:", tails, "次", sep="")
print("最多连续正面:", max_heads, "次", sep="")
print("最多连续反面:", max_tails, "次", sep="")
最佳答案
2020-12-9 12:12:53
输入100,会把每次的结果打印给你看,正面,反面。。
输入101,不会把每次的结果打印给你看,只会告诉你最终的结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-9 09:43:15 | 显示全部楼层
本帖最后由 逃兵 于 2020-12-9 09:45 编辑

首先说① ②
①如果掷硬币次数非常多的话 →   ignore = True 否则 ignore = False
如果ignore不为真的话我们就不再单独打印每次的结果
#这属于一条附加项,如果你希望无论掷硬币多少次都打印结果的话,可以去掉
if not ignore:      #这里可以看成 if not True 或者 if not False
        print("正面", end=" ")

②判断掷硬币的次数是否超过100次
如果超过100次,变量 ignore 就变为布尔类型 True,用于后面的判断 if not ignore,相当于if not True
否则,ignore 就变为布尔类型 False,用于后面的判断 if not ignore,相当于if not False
100并不是定值,只是原作者的期望值,你可以设定为50,500,1000..相当于你期望打印的最大值
设定好这个值以后
当你输入的值大于你期望的值,将不会再每次打印结果


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

使用道具 举报

 楼主| 发表于 2020-12-9 10:36:55 | 显示全部楼层
逃兵 发表于 2020-12-9 09:43
首先说① ②
①如果掷硬币次数非常多的话 →   ignore = True 否则 ignore = False
如果ignore不为真的话 ...

1、①和②的解释,我还是看不懂。我看不出来True 和 False 和单不单独打印到底有什么关系。
2、就算 if not ignore 变为 if not True (False), if not True(False) 不就是等于 if true(false)吗, 但这又跟是否单独打印有什么联系呢?
3、教材也没有将这些逻辑运算符该怎么理解和使用,我也算是懵啊!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-9 11:21:16 | 显示全部楼层
Fring 发表于 2020-12-9 10:36
1、①和②的解释,我还是看不懂。我看不出来True 和 False 和单不单独打印到底有什么关系。
2、就算 if  ...

这就是个判断了呀,
if 和while是条件语句,只有真的时候才会运行
print("正面", end=" ")和print("反面", end=" ")跟在这个条件语句下面,不符合条件的话就不会打印了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-9 11:33:12 | 显示全部楼层
逃兵 发表于 2020-12-9 11:21
这就是个判断了呀,
if 和while是条件语句,只有真的时候才会运行
print("正面", end=" ")和print("反 ...

但是这个ingore 的真假到底是和哪句代码之间在衔接啊??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-9 11:40:36 | 显示全部楼层
Fring 发表于 2020-12-9 11:33
但是这个ingore 的真假到底是和哪句代码之间在衔接啊??

if counts > 100:
    ignore = True
else:
    ignore = False
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-9 11:43:59 | 显示全部楼层
逃兵 发表于 2020-12-9 11:21
这就是个判断了呀,
if 和while是条件语句,只有真的时候才会运行
print("正面", end=" ")和print("反 ...

1、ingore 的真假是由纸掷硬币的次数来判定的,但是num是随机抽取,如果有余数它他就输出证明,但是和ingore有什么关系呢。我同时认为,假如举例,如果掷硬币的次数为101,那么ingore就是假,并且num 取的数带入计算公式,最后得的值有余数,此时因为iif not ignore 或者说 if not False,于是打印正面。但是这里有个问题,如果去掷硬币次数100次,那么ingore 为真,且num 取的数带入计算公司,最后取得的值有余数,此时因为 if not ingore 或者说 if not true ,于是打印正面。所以,从前面两个例子可以看出,不管是否ignore 为真或假,只要num 取的数带入计算公式得出的值并有余数,它都会打印出正面,那么,ingore 的真假还有什么意义呢,答案解释的是判断是否打印,但是我无法它是怎么判断它是如何认定真和假来进而确定打印和不打印的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-9 11:50:22 | 显示全部楼层
Fring 发表于 2020-12-9 11:43
1、ingore 的真假是由纸掷硬币的次数来判定的,但是num是随机抽取,如果有余数它他就输出证明,但是和ing ...

你运行一遍99,再运行一遍100
看看有什么区别
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-9 11:56:39 | 显示全部楼层
逃兵 发表于 2020-12-9 11:50
你运行一遍99,再运行一遍100
看看有什么区别

这个只有结果,我看不出来任何区别。你要不假设一个数据,按照代码流程写个运行过程,并附上解释(尤其是关于真假判断和是否打印的部分的运行逻辑和过程)?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-9 12:04:29 | 显示全部楼层
本帖最后由 逃兵 于 2020-12-9 12:09 编辑
Fring 发表于 2020-12-9 11:56
这个只有结果,我看不出来任何区别。你要不假设一个数据,按照代码流程写个运行过程,并附上解释(尤其是 ...


说错了,输入100和101有什么区别
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-9 12:12:53 | 显示全部楼层    本楼为最佳答案   
输入100,会把每次的结果打印给你看,正面,反面。。
输入101,不会把每次的结果打印给你看,只会告诉你最终的结果
掷硬币.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-9 12:13:26 | 显示全部楼层
逃兵 发表于 2020-12-9 12:04
说错了,输入100和101有什么区别

算了,我说的是要个过程,我又没法验证每一步它是怎么判断的,所以测试任何数都没有任何区别。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-9 12:32:26 | 显示全部楼层
Fring 发表于 2020-12-9 12:13
算了,我说的是要个过程,我又没法验证每一步它是怎么判断的,所以测试任何数都没有任何区别。

你不理解ignore是真是假的区别,

所以贴了个图让你看ignore为假
和ignore为真的区别了

你还认为测试任何数没有区别???
还是你在图中除了最终的结果不同以外 看不出来有什么其他的区别?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-9 12:33:04 | 显示全部楼层
逃兵 发表于 2020-12-9 12:12
输入100,会把每次的结果打印给你看,正面,反面。。
输入101,不会把每次的结果打印给你看,只会告诉你最 ...

还是没懂,如果输入101次,那么 ignore = True ,那么 not ignoe等于什么呢,我理解的是 因为ignore  = True ,所以 not ignore = Flalse ,又因为 ,Flase !=True ,ignore = True ,所以Flese != ingore ,所以if not ingore 就相当于if not ingore 这个整体 要为 True ,因为101次决定ingore = True ,但是not ingore 是为Flase ,所以 if not ingore == flase, 所以不符合条件,所以就没有打印正面(反面)。我不知道我这个理解对不对,还是我对 not ingore 本身的运用理解错误?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-9 12:35:09 | 显示全部楼层
Fring 发表于 2020-12-9 12:33
还是没懂,如果输入101次,那么 ignore = True ,那么 not ignoe等于什么呢,我理解的是 因为ignore  = Tr ...

这个理解对了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-9 12:36:38 | 显示全部楼层
逃兵 发表于 2020-12-9 12:12
输入100,会把每次的结果打印给你看,正面,反面。。
输入101,不会把每次的结果打印给你看,只会告诉你最 ...

关键是我还是不not ingore在什么样的情况才能回打印呢,我搞不懂这个逻辑啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-9 12:45:17 | 显示全部楼层
Fring 发表于 2020-12-9 12:36
关键是我还是不not ingore在什么样的情况才能回打印呢,我搞不懂这个逻辑啊。

你对布尔类型的知识可能不太扎实
我稍微谈一下布尔类型

布尔类型只有两个值,真 和 假
一般用作条件语句
条件为真实,条件语句才会执行

以下对象会被python判定为假
(1)整型的0和浮点型的0.0
(2)None对象类型
(3)空对象
比如空字符串'';

比如空列表[];

比如空集合{};

比如空元组();

等等的空对象。

  上面的这些空对象都会被python判断为假。

另外,not 假 则为真
not 真 则为假
>>> True
True
>>> not True
False
>>> False
False
>>> not False
True
>>> ignore = True
>>> ignore
True
>>> not ignore
False
>>> ignore = False
>>> ignore
False
>>> not ignore
True
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-9 12:52:54 | 显示全部楼层
本帖最后由 Fring 于 2020-12-9 12:55 编辑


1、还有就是这个条件语句是不是省略是什么,比如 if not ingore: 是不是可以还原成 if not ingore == True:,也就是说 if not ingore: 和 if not ingore == True: 是相同的表达语句,并且表达的意思相同?
2、如果假设正确的话,还是以掷的次数为101次,那么 ingore = True , not ingore == Flase, if fale == flase, 所以 if not ingore == if flase == false ! = ingore = True 【ingore = True 表示前面 掷的次数为101,所以ingore = True 这个前提】 ,所以if not ingore 不满足 ingore 为真这个前提,所以就没有打印出正面(反面)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-9 13:04:12 | 显示全部楼层
Fring 发表于 2020-12-9 12:52
1、还有就是这个条件语句是不是省略是什么,比如 if not ingore: 是不是可以还原成 if not ingore == T ...

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

使用道具 举报

 楼主| 发表于 2020-12-9 13:18:00 | 显示全部楼层

好的,好开心。真心感谢,能再给我解释其中last变量假设的使用方法和思维。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-10 21:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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