鱼C论坛

 找回密码
 立即注册
查看: 1446|回复: 7

[已解决]掷骰子验证问题

[复制链接]
发表于 2022-3-19 12:59:51 | 显示全部楼层 |阅读模式

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

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

x
题目:掷骰子3次,有人说掷出666和253的概率是一样的,请用程序模拟大量的人,大量的次数掷骰子的过程,验证这种说法是不是对的。

import random
s=0
k=0
for i in range(1,1000000,1):
    a=random.sample('123456',3)
    if a=="['6', '6', '6']":
        s=s+1
    if a=="['2', '5', '3']":
        k=k+1
print(s,k)

请问这样写代码,调整了几次i的终值,输出的s和k的结果都是0,是哪里出问题了呢?这个应该如何编写呢?
最佳答案
2022-3-19 19:46:23
wadmdmaw 发表于 2022-3-19 18:46
这个代码感觉对我来说太复杂了...可以请问一下如果就用if,random函数分两种情况,为什么运行 ...

以你的代码为例:
第一,如 2 楼大佬说的那样,去掉双引号,直接用整数便可。
第二,不要用 random.sample() 函数,不然永远达不到 [6, 6, 6] 这种情形,因为 sample() 是不重复的
第三,比较符 a == [2, 5, 3] 看似没有问题,实则有问题,假设掷出 [3, 2, 5] 呢? a != [3, 2, 5] 呗,所以必须先排序,再做比较。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-19 13:02:21 | 显示全部楼层
  1. import random
  2. s=0
  3. k=0
  4. for i in range(1,1000000,1):
  5.     a=random.sample('123456',3)
  6.     if a==['6', '6', '6']:       # 不要给列表加上双引号,不然它就是字符串了
  7.         s=s+1
  8.     if a==['2', '5', '3']:       # 去掉双引号
  9.         k=k+1
  10. print(s,k)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-19 14:09:30 | 显示全部楼层
复习复习:
  1. import random as rand

  2. throw = lambda: rand.choice(range(1, 7))
  3. tosses = lambda n: [throw() for _ in range(n)]
  4. check = lambda A, B: A == B

  5. A = [6, 6, 6]
  6. B = [2, 3, 5]

  7. a = b = 0

  8. for n in range(1000000):
  9.     C = sorted(tosses(3))
  10.     a += check(A, C)
  11.     b += check(B, C)

  12. print(f"掷骰子 3 次,掷出 6、6、6 的次数是 {a}({a/1e6*100}%),掷出 2、5、3 的次数是 {b}({b/1e6*100}%)")
复制代码
  1. 掷骰子 3 次,掷出 6、6、6 的次数是 4620(0.462%),掷出 2、5、3 的次数是 27792(2.7792%)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-19 18:46:23 | 显示全部楼层

这个代码感觉对我来说太复杂了...可以请问一下如果就用if,random函数分两种情况,为什么运行出来不对么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-19 19:46:23 | 显示全部楼层    本楼为最佳答案   
wadmdmaw 发表于 2022-3-19 18:46
这个代码感觉对我来说太复杂了...可以请问一下如果就用if,random函数分两种情况,为什么运行 ...

以你的代码为例:
第一,如 2 楼大佬说的那样,去掉双引号,直接用整数便可。
第二,不要用 random.sample() 函数,不然永远达不到 [6, 6, 6] 这种情形,因为 sample() 是不重复的
第三,比较符 a == [2, 5, 3] 看似没有问题,实则有问题,假设掷出 [3, 2, 5] 呢? a != [3, 2, 5] 呗,所以必须先排序,再做比较。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-19 19:53:31 | 显示全部楼层
wadmdmaw 发表于 2022-3-19 18:46
这个代码感觉对我来说太复杂了...可以请问一下如果就用if,random函数分两种情况,为什么运行 ...

如果修正你的代码,如下:
  1. import random
  2. s = 0
  3. k = 0
  4. for i in range(1000000):
  5.     a = random.choice(range(1, 7))
  6.     b = random.choice(range(1, 7))
  7.     c = random.choice(range(1, 7))
  8.     arr = sorted([a, b, c])
  9.     if arr == [6, 6, 6]:
  10.         s += 1
  11.     if arr == [2, 3, 5]:
  12.         k += 1
  13. print(s, k)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-19 21:00:54 From FishC Mobile | 显示全部楼层
from random import randrange as r

res = [{r(1, 7), r(1, 7), r(1, 7)} for _ in range(10000)]
print("666 ->", res.count({6, 6, 6}))
print("235 ->", res.count({2, 3, 5}))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-20 15:27:31 | 显示全部楼层


谢谢!不好意思昨天不知道怎么回事没有看到二楼…确实是字符串和列表弄混了…但经过五楼提醒好像发现这道题我用的sample是搞不出来666这个组合的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 19:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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