python - 选择列表中受其位置影响的随机元素

标签 python python-3.x random

我有一个包含四个元素的列表,并选择其中一个来最大化我这样做的第一个元素的机会:

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/

相关文章:

python - 生成名词的复数形式

python - pygame 中的图像未更新

ruby - 在 Ruby 上以随机延迟执行代码

python:具有概率的随机样本

python - PyCharm 在哪里存储编译后的文件?

python - 如何替换列中的重复值以使其基于 Pandas 中的另一列是唯一的?

python在数组切片中找到高值(value)

python - 有没有一种简单的方法可以将 PyCharm 和 WinPython 的整个安装放在 USB 内存棒上?

python - 如何在元组列表中构建特定项目的列表。 PYTHON

c++ - rand() 给出序列号,即使在我的 Mac 上播种时也是如此