随机数与概率相关的问题

68
我想知道最好的方法(例如在Java中)生成特定范围内的随机数,其中每个数字都有一定的概率出现或不出现?
例如:
生成介于[1;3]之间的随机整数,并具有以下概率:
P(1)= 0.2
P(2)= 0.3
P(3)= 0.5
目前我正在考虑的方法是在[0;100]内生成随机整数,并执行以下操作:
如果它在[0;20]之间 - 我得到了我的随机数字1。
如果它在[21;50]之间 - 我得到了我的随机数字2。
如果它在[51;100]之间 - 我得到了我的随机数字3。
你认为呢?

9
我认为这样做是很聪明的方式,但我不知道是否有更好的方法。请确保数字从0到99,否则你会得到101个数字,而不是你想要的准确百分比。 - Blub
3
是的,这看起来很合理,否则你可以使用EnumeratedIntegerDistribution,示例可在此处查看(https://dev59.com/2HHYa4cB1Zd3GeqPQtu2#16436249)。 - kiruwka
1
虽然在SSJ中没有找到针对您问题的相关实现,但是您应该比我更仔细地查看它... - Yaneeve
12个回答

0
这里是 Python 代码,即使你要求 Java,但它非常类似。
# weighted probability

theta = np.array([0.1,0.25,0.6,0.05])
print(theta)

sample_axis = np.hstack((np.zeros(1), np.cumsum(theta))) 
print(sample_axis)

[0. 0.1 0.35 0.95 1. ]。这代表累积分布。

您可以使用均匀分布在此单位范围内绘制索引。

def binary_search(axis, q, s, e):
    if e-s <= 1:
        print(s)
        return s
    else: 
        m = int( np.around( (s+e)/2 ) )
        if q < axis[m]:
            binary_search(axis, q, s, m)
        else:
            binary_search(axis, q, m, e)



range_index = np.random.rand(1)
print(range_index)
q = range_index
s = 0
e = sample_axis.shape[0]-1
binary_search(sample_axis, q, 0, e)

0
这可能对某些人有用,我用Python写了一个简单的程序。你只需要改变p和r的写法即可。例如,这个程序将在0到0.1之间投射随机值到1e-20到1e-12之间。
import random

def generate_distributed_random():
    p = [1e-20, 1e-12, 1e-10, 1e-08, 1e-04, 1e-02, 1]
    r = [0, 0.1, 0.3, 0.5, 0.7, 0.9, 1]
    val = random.random()
    for i in range(1, len(r)):
        if val <= r[i] and val >= r[i - 1]:
            slope = (p[i] - p[i - 1])/(r[i] - r[i - 1])
            return p[i - 1] + (val - r[i - 1])*slope


print(generate_distributed_random())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接