我有一个包含四个元素的列表,并选择其中一个来最大化我这样做的第一个元素的机会:
from random import choice
_list = [19,14,29,3]
element = choice((a[0],a[0],a[0],a[0],a[1],a[1],a[1],a[2],a[2],a[3]))
尽管现在 _list
中的元素数量是可变的,但试图保留与我编写此代码之前相同的行为:
from random import choice
_list = [19,14,29,3,.......] # n elements
weighted = []
for i in range(len(_list)):
for j in range(len(_list)-i):
weighted.append(_list[i])
element = choice(weighted)
还有其他方法可以用更少的代码达到相同的结果并且效率更高吗?因为我认为如果n
变得太大,那么加权
将会很大并且会减慢我的算法。
最佳答案
实际上有一个内置函数可以为您执行此操作:
random.triangular(0, length, 0)
Here's the documentation for that function
如果您想自己编写它,实际上可以在不使用任何循环的情况下完成此操作。如果你正确地看待它,很容易看出它是如何发生的。例如,有 6 个元素,您可以将其可视化如下:
|
| |
| | |
| | | |
| | | | |
| | | | | |
0 1 2 3 4 5
如果我们翻转它并将其放回原处,我们可以得到一个矩形:
5 4 3 2 1 0
| | | | | |
- | | | | |
| - | | | |
| | - | | |
| | | - | |
| | | | - |
| | | | | -
| | | | | |
0 1 2 3 4 5
对于长度为 6 的列表,矩形的高度为 7,宽度为 6。因此,您只需选择两个随机整数并找出该坐标属于哪个数字即可。这可以通过简单的计算来完成 - 断点正下方的所有坐标的 x+y 等于 n-1,而断点正上方的所有坐标的 x+y 等于 n。话不多说,代码如下:
def triangle_random(count):
x = random.randint(0, count-1) # randint includes both ends, so we need count-1
y = random.randint(0, count)
if x + y < count:
return x
else:
return count-1 - x
关于python - 选择列表中受其位置影响的随机元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24255986/