Java - 生成随机数字簇

Java - generating random clusters of numbers

我有一个数组,我想 "randomly" select 来自那个数组的东西,但我希望它获得簇的概率更高。

例如:

arr = [1, 3, 4, 6, 7, 9, 10]
x = Math.random() * arr.length;
return arr[x]

如果 x 结果为 3,则函数将 return 6. 如何增加下一个数字 x 为 2 或 4 的可能性(然后是 1 和 5 等等,概率曲线越远离当前 x)。这可行吗?

问题有点笼统,我的回答也是如此。

了解你想要实现的目标是几何概率最简单的(对我来说)。

让我们从第一个案例开始,索引是随机的,假设您有长度为 5 的数组。

   0  |_|_|_|_|_| 5

然后您从 <0,1,2,3,4> 组中选择一个随机值。在这个准确度水平上,我们可以假设它们是等概率的。

那么,如果我们只想让其中一个的概率是其他概率的两倍怎么办?我们扩大了该索引的插槽。

   0  |_ _|_|_|_|_| 5

现在我们从 <0,1,2,3,4,5> 集合中选择一个值,但是,我们说 0 和 1 都表示选择索引 0 处的元素。

因此,如果我们保留第二个数组,其中我们将保留其插槽的宽度,我们仍然可以随机化结果,但它会将其与值范围(自定义长度)相匹配,从而使一个 more/less 可能比另一个。

然后我的方法是创建第二个整数数组,编写函数获取这个数组和第一个随机索引,用范围的上限填充它们(下限在索引--)。该范围将与与第一个索引的距离有关,从而使第一个随机索引居中。

然后再创建一个函数进行随机化,将结果与范围数组和元素数组中的 returns 对应元素进行匹配。

这可能很天真,但我能理解。希望对你有帮助。

使用归一化高斯分布我会做这样的事情:

public class ClusterRandom{

    Random dice = new Random();
    int mRange;
    int mWidth = 1;
    int mMean;

    public ClusterRandom(int range, int startingMean, int...width){
        mRange = range;
        mMean = startingMean;
        if(width.length > 0) 
            mWidth = width[0];
    }

    public int nextInt(){

        int pick;        

        do{
              pick = (int) Math.round((dice.nextGaussian()*mWidth) + mMean);     
        }while(pick < 0 || pick >= mRange);

        mMean = pick;
        return pick;

    }

}

然后在你的代码中:

int[] arr = new int[]{1, 3, 4, 6, 7, 9, 10};
// for example starting from index 3 which is 6
ClusterRandom clusterDice = new ClusterRandom(arr.length, 3);
// ...
// in loop
return arr[clusterDice.nextInt()];