【问题标题】:How can I transform numbers in a range of 0-1 to a 1-52 range using Discrete Uniform Distribution in Python?如何使用 Python 中的离散均匀分布将 0-1 范围内的数字转换为 1-52 范围内的数字?
【发布时间】:2020-12-02 18:42:46
【问题描述】:

我正在寻找的是 Python 中的一种方法或任何其他解决此问题的方法,因为我知道有一种方法,但我找不到它,在上下文中我正在做的是计算概率一对,两对等出现在使用 Montecarlo 方法的扑克游戏中,目前我正在使用 random.sample 函数来做到这一点,但我想使用我自己的方法来生成随机数,返回 0- 之间的数字1,我想使用离散均匀分布来确保每个数字都有相同的出现概率。

感谢您提供的任何帮助。

【问题讨论】:

  • 为什么不直接使用random.choice(range(1, 53))? (而不是在 (0,1) 中获取随机数并将其转换为 [1, 52] 中的离散数)
  • @LoMaPh Python 使用的 Mersenne Twister 不错,但并不完美;见It is high time we let go of the Mersenne Twister。我认为问如何使用替代品很好。
  • 随机数是0-1浮点数还是单位整数?
  • 是的 LoMaPh,但与我现在使用的 random.sample 函数几乎相同,我的意思是这从我生成的 52 套扑克列表中抽取 X 大小手的样本.
  • @Mark Ransom 我的方法生成的数字是伪随机数,你知道像 0.03245、0.764... 所以我猜是浮点数

标签: python montecarlo


【解决方案1】:

这是一个比 python 更多的数学问题。这是解决方案:

代码:

import random

arr_0_1 = [random.random() for i in range(10)]
print(arr_0_1)
d = 1/51
arr_1_52 = [n/d + 1  for n in arr_0_1]
print(arr_1_52)

输出:

[0.49864143060719257, 0.9124661869543931, 0.14064674065024652, 0.6162308610305717, 0.698038549502753, 0.18002207940954196, 0.7337352732415695, 0.34955525833304546, 0.6380173638897209, 0.14733996159513485]
[26.430712960966822, 47.535775534674045, 8.172983773162573, 32.42777391255916, 36.5999660246404, 10.18112604988664, 38.42049893532005, 18.82731817498532, 33.53888555837577, 8.514338041351877]

【讨论】:

  • 是的,我认为它可以在我的程序中运行,因为我实际上使用了 5 号扑克牌,但是我在书中找到了另一种方法,所以我将自己回答问题,但是您的回答也有效,也不能给您积分,因为我是新用户,但我真的很感谢您的帮助。谢谢
【解决方案2】:

如果数字是介于 0 和 1 之间的浮点数(范围 [0, 1)),您可以这样做:

int(random() * 52)

在 0 到 51(范围 [0, 51])之间获得一个随机的 int
或者这样做:

int(random() * 52) + 1

在 1 到 52(范围 [1, 52])之间获得一个随机的 int

【讨论】:

  • 如果随机范围是[0, 1]而不是[0, 1),您仍然可以使用int(random() * 52),但检查结果是否为52,如果是则丢弃。
【解决方案3】:

Solution

这个解决方案也是有效的,它给了我同样的结果。

【讨论】:

  • 你的图片是简单的文字,所以你应该把它写成文字,而不是张贴它的图片。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 2011-05-12
  • 1970-01-01
相关资源
最近更新 更多