我有这样的数据:
d = (
(701, 1, 0.2),
(701, 2, 0.3),
(701, 3, 0.5),
(702, 1, 0.2),
(702, 2, 0.3),
(703, 3, 0.5)
)
Run Code Online (Sandbox Code Playgroud)
其中(701,1,0.2)=(id1,id2,priority)
如果我知道id1,使用优先级,有没有一种选择id2的漂亮方法?
Func(701)应该返回:
1 - 在20%的情况下
2 - 30%
3 - 50%
百分比当然很粗糙
关于如何找到一个干净的算法来执行以下操作,我有点不知所措:
假设我有一个字典k:
>>> k = {'A': 68, 'B': 62, 'C': 47, 'D': 16, 'E': 81}
Run Code Online (Sandbox Code Playgroud)
我现在想要根据它们在总(即总和)数量上的"权重"随机选择其中一个键.
>>> sum(k.values())
>>> 274
Run Code Online (Sandbox Code Playgroud)
所以有一个
>>> 68.0/274.0
>>> 0.24817518248175183
Run Code Online (Sandbox Code Playgroud)
选择A的变化率为24.81%.
你会如何编写一个能够解决这个问题的算法?换句话说,这确保在10.000随机选择中,A将被选择2.481倍?
我正在寻找一个合理的函数定义weighted_sample,它不会为给定权重列表返回一个随机索引(这类似于
def weighted_choice(weights, random=random):
""" Given a list of weights [w_0, w_1, ..., w_n-1],
return an index i in range(n) with probability proportional to w_i. """
rnd = random.random() * sum(weights)
for i, w in enumerate(weights):
if w<0:
raise ValueError("Negative weight encountered.")
rnd -= w
if rnd < 0:
return i
raise ValueError("Sum of weights is not positive")
Run Code Online (Sandbox Code Playgroud)
给出一个具有恒定权重的分类分布)但随机抽样k的那些,没有替换,就像random.sample行为相比random.choice.
就像weighted_choice可以写成一样
lambda weights: random.choice([val for val, cnt in enumerate(weights) …Run Code Online (Sandbox Code Playgroud) 看看这个问题:
最佳答案建议使用switch语句来完成工作.但是,如果我需要考虑大量案例,那么代码看起来非常不优雅; 我有一个巨大的switch语句,在每种情况下一遍又一遍地重复使用非常相似的代码.
当您有大量概率需要考虑时,是否有一种更好,更清晰的方式来选择具有一定概率的随机数?(比如~30)
我有3个标签:"A","B","C".
我想生成一个包含100个元素的随机列表,其中60%是"A",30%是"B",10%是"C".
我怎样才能做到这一点?(我是python中的新手,希望这个问题不是太傻.)
编辑:我的问题与这个问题略有不同: 生成具有给定(数字)分布的随机数
就像在评论中一样,我希望它们中的60%都是"A",并非每个元素都有60%的概率为"A".所以numpy.random.choice()不是我的解决方案.
可能重复:
随机加权选择
生成具有给定(数字)分布的随机数
我有一个列表列表,其中包含一系列数字和相关概率.
prob_list = [[1, 0.5], [2, 0.25], [3, 0.05], [4, 0.01], [5, 0.09], [6, 0.1]]
Run Code Online (Sandbox Code Playgroud)
例如,prob_list[0]数字1的概率为0.5,与之相关.所以你会期望1出现50%的时间.
当我选择数字时,如何为数字增加权重?
注意:列表中的数字量可以在6到100之间变化
编辑
在列表中,我有6个数字及其相关概率.我想根据它们的概率选择两个数字.
没有数字可以选择两次.如果选择"2",则无法再次选择.
我想生成一个整数随机数,其概率分布函数作为列表给出。例如,如果 pdf=[3,2,1] 那么我喜欢 rndWDist(pdf) 返回 0,1 和 2,概率为 3/6、2/6 和 1/6。我为此编写了自己的函数,因为我在 random 模块中找不到它。
def randintWDist(pdf):
cdf=[]
for x in pdf:
if cdf:
cdf.append(cdf[-1]+x)
else:
cdf.append(x)
a=random.randint(1,cdf[-1])
i=0
while cdf[i]<a:
i=i+1
return i
Run Code Online (Sandbox Code Playgroud)
有没有更短的方法来达到相同的结果?
我遇到了问题.我必须在python中实现一个算法,它需要一个随机数X,如Pr [X≥k] = 1/k.我不知道是否已经存在一个可以给我这个确切值的分布,或者是否有办法使用简单的随机python库实现这个随机生成器.有没有办法做到这一点?预先感谢您的帮助!
[0,2*pi)我可以使用 numpy 的函数获得统一的网格np.arange(),但是,我想要一个具有相同数量的点但在特定间隔上具有更多点密度的网格,即例如具有更精细的网格 [pi,1.5*pi]。我怎样才能实现这一点,是否有一个 numpy 函数接受密度函数并且它的输出是具有该密度的网格?
python ×9
random ×5
probability ×2
algorithm ×1
coding-style ×1
ios ×1
numpy ×1
scipy ×1
statistics ×1
swift ×1