计算概率的更好方法

2024-09-30 08:21:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我想帮助找到一个更好的方法,使我的骰子程序的概率。你知道吗

以下是我的全部代码:

import random,collections

probabiltyOfDice = {}
rolls = 100

#Counters
counter1 = 0
counter2 = 0
counter3 = 0
counter4 = 0
counter5 = 0
counter6 = 0

for x in range(rolls):
    output = random.randint(1,6)
    if output == 1:
        counter1 += 1
        probabiltyOfDice[1] = counter1
    elif output == 2:
        counter2 += 1
        probabiltyOfDice[2] = counter2
    elif output == 3:
        counter3 += 1
        probabiltyOfDice[3] = counter3
    elif output == 4:
        counter4 += 1
        probabiltyOfDice[4] = counter4
    elif output == 5:
        counter5 += 1
        probabiltyOfDice[5] = counter5
    elif output == 6:
        counter6 += 1
        probabiltyOfDice[6] = counter6

ordered = collections.OrderedDict(sorted(probabiltyOfDice.items()))
print(ordered)

我的方法是有效的,如果将恒定转鼓数设置为100,则输出如下:

OrderedDict([(1, 15), (2, 16), (3, 14), (4, 22), (5, 21), (6, 12)])

OrderedDict显示骰子编号以及该编号出现的次数。我可以通过使用6个计数器变量和一组if-elif语句来解决这个问题。你知道吗


我正在使用集合库订购词典以供展示。但我希望有人能给我一个更好的方法来解决这个问题。你知道吗

显然,使用6个变量和许多if语句可能是解决这种情况的冗长方法。你知道吗


Tags: 方法outputifrandom骰子collectionsordereddictelif
2条回答

因此,python有一个非常方便的字典子类Counter,本质上,它在计算计数方面非常快。 我精心设计了以下内容:

import random
from collections import Counter

prob = Counter([random.randint(1,6) for _ in range(10000)])

print(prob)
>> Counter({1: 1650, 2: 1750, 3: 1679, 4: 1546, 5: 1686, 6: 1689})

现在,问题是它只能在一个合理的大范围内工作。因此,为了避免创建中间列表,我们可以采用以下方法: 随机导入 从集合导入计数器

prob = Counter()

for _ in range(10000000):
   prob[random.randint(1,6)] += 1

print(prob)
>> Counter({1: 13084052,
     2: 13087518,
     3: 13090177,
     4: 13086193,
     5: 13081778,
     6: 13085341})

编辑:添加第三个版本(基本上是第一个版本),放弃中间列表,使用更方便的生成器,正如@Mark Dickinson建议的那样:

import random
from collections import Counter

prob = Counter(random.randint(1,6) for _ in range(1000000))

print(prob)
>> Counter({1: 166503, 2: 166833, 3: 166531, 4: 166681, 5: 166846, 6: 166606})

我们可以通过使用列表来简化代码。这里的列表包含六个元素,最初都设置为零:

import random, collections

rolls = 100

#Counters
counters = [0] * 6

for x in range(rolls):
    output = random.randint(1,6)
    counters[output-1] += 1

ordered = collections.OrderedDict(enumerate(counters, 1))
print(ordered)

跑步时,它会在我的机器上打印:

>>> print(ordered)
OrderedDict([(0, 12), (1, 11), (2, 17), (3, 31), (4, 14), (5, 15)])

我们可以通过生成一个介于05(两者都包含在内)之间的数字来略微提高代码的效率:

rolls = 100

#Counters
counters = [0] * 6

for x in range(rolls):
    output = random.randint(0, 5)
    counters[output] += 1

ordered = collections.OrderedDict(enumerate(counters, 1))
print(ordered)

相关问题 更多 >

    热门问题