鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 冬雪雪冬

[技术交流] Python:每日一题 137

[复制链接]
发表于 2018-1-14 17:42:51 | 显示全部楼层
趋势如果成正太分布就对了,但我不会怎么模拟出这个场景
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-14 18:48:04 | 显示全部楼层
import random
k=int(input ('请输入需要测试球的总数'))
num = [0]*10
for i in range(k):
    j=0
    for t in range(9):
        j=random.randint(j,j+1)
    num[j] += 1
print(num)

====================== RESTART: D:\Python34\linshi4.py ======================
请输入需要测试球的总数100000
[237, 1774, 7044, 16355, 24581, 24547, 16538, 6947, 1796, 181]
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-1-15 12:46:39 | 显示全部楼层
久疤K 发表于 2018-1-13 22:54
显然这不是模拟出来的,这是算概率后计算出来的,而且最终的球数目不对。
  1. #  是的,当时不知道怎么模拟,只好计算春概率了。
  2. #  因为四舍五入,最终球的数目对不上。
  3. #  看了别人的代码,明白了怎么搞随机掉落。
  4. #  试着写了下,random.random()<0.5掉在左边,否则掉在右边,结果符合预期了。

  5. import random
  6. def drop():
  7.     a = [[0 for i in range(10)] for j in range(10)]
  8.     for i in range(10):
  9.         if i == 0:
  10.             index = 0
  11.             a[i][index] = 1
  12.         elif i > 0:
  13.             index = a[i-1].index(1) if random.random() < 0.5 else a[i-1].index(1)+1
  14.             a[i][index] = 1
  15.     return a[9].index(1)

  16. result = {}
  17. for i in range(10):
  18.     result[i] = 0

  19. n = 100000
  20. for i in range(n):
  21.     result[drop()] += 1

  22. for k in result:
  23.     print(k, '-->', result[k])

  24. ##    0 --> 204
  25. ##    1 --> 1680
  26. ##    2 --> 7027
  27. ##    3 --> 16255
  28. ##    4 --> 24737
  29. ##    5 --> 24709
  30. ##    6 --> 16488
  31. ##    7 --> 7008
  32. ##    8 --> 1680
  33. ##    9 --> 212
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-15 13:48:19 | 显示全部楼层
本帖最后由 h20060304 于 2018-1-15 13:49 编辑

来凑下热闹:

可以实现 任意多行,任意多次试验。

直接上代码:


  1. import random
  2. import time


  3. def zero_or_one():
  4.     if random.random() < 0.5:
  5.         t = 0
  6.     else:
  7.         t = 1
  8.     yield t


  9. # 最终位置: 往左不变, 往右加 1
  10. def get_str(num_of_sphere=10, r=10):
  11.     while num_of_sphere:
  12.         final_position = 0
  13.         for i in range(r - 1):
  14.             direction = next(zero_or_one())
  15.             if direction:
  16.                 final_position += 1
  17.         num_of_sphere -= 1
  18.         yield final_position


  19. total = 1000
  20. row = 10
  21. print('试验总球数为: {}'.format(total))
  22. t_list = list(get_str(total, row))
  23. starttime = time.time()
  24. for num in range(row):
  25.     print('落在第 {} 个位置的球个数为: {}'.format(num, t_list.count(num)))
  26. print('花费的时间:{}'.format(time.time() - starttime))
复制代码


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

使用道具 举报

发表于 2018-1-16 13:41:57 | 显示全部楼层
本帖最后由 Elastcio 于 2018-1-16 14:08 编辑
  1. import random
  2. result = []
  3. for i in range(10):
  4.     result.insert(i,0)
  5. t=0
  6. while t<100000:
  7.     ball = 0
  8.     for i in range(9):
  9.         ball += random.randint(0,1)
  10.     result[ball] += 1
  11.     t += 1
  12. print(result)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-9 21:34:25 | 显示全部楼层
  1. import random as r
  2. n=100000
  3. L=[0]*10
  4. def step():
  5.     return r.randint(0,1)-0.5
  6. while n:
  7.     start=4.5
  8.     t=9
  9.     while t:
  10.         start += step()
  11.         t -= 1
  12.     L[int(start)]+=1
  13.     n -= 1
  14. print(L)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-23 17:46:39 | 显示全部楼层
本帖最后由 咕咕鸡鸽鸽 于 2019-3-23 17:56 编辑

算法稍微改了一下,不知道是不是这样算
  1. import random

  2. def fun137():
  3.     res_list = []
  4.     for test in range(100000):
  5.         #先算一个球的趋向
  6.         str1 = ""
  7.         for i in range(10):            
  8.             str1 += random.choice(["+","-"])
  9.         res = eval("10" + "1".join(str1)[:-1])
  10.         res_list.append(res//2)

  11.     count_dict = {}
  12.     for i in range(10):
  13.         count = res_list.count(i)
  14.         count_dict[i] = count
  15.         

  16.     return count_dict

  17. print(fun137())
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 15:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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