【问题标题】:Java - generating random clusters of numbersJava - 生成随机数字簇
【发布时间】:2015-06-30 12:56:35
【问题描述】:

我有一个数组,我想从该数组中“随机”选择一些东西,但我希望它获得集群的概率更高。

例如:

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

如果x 的结果为 3,则该函数将返回 6。如何增加下一个数字 x 为 2 或 4 的可能性(然后是 1 和 5,依此类推,与离当前x 越远的概率弯曲)。这可行吗?

【问题讨论】:

  • 对于您描述的模式,看起来您根本不希望它们是随机的。当然,这是可行的,但请尝试在此处阐明您真正想要完成的任务。
  • 你想增加相似度还是强制选择 2 或 4?
  • Math.random() 返回一个介于 0 和 1 之间的双精度值(注意 Math.random(),而不是 Math.rand())(包括 0,不包括 1)。如果你想返回一个介于 0 和 arr.length 之间的整数,你需要写 x = Math.random() * arr.length;
  • @Onheiron 只是增加可能性。
  • 你需要决定你想要什么样的分布。

标签: java random probability


【解决方案1】:

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

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()];

【讨论】:

  • 谢谢,nextGaussian 似乎是我特别要找的东西。
【解决方案2】:

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

用几何概率最容易(对我来说)了解您想要实现的目标。

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

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

然后从&lt;0,1,2,3,4&gt; 集合中选择一个随机值。在这个准确度水平上,我们可以假设它们的可能性相同。

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

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

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

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

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

然后你再创建一个函数来进行随机化,将结果与范围数组匹配,并从元素数组中返回相应的元素。

这可能很幼稚,但这是我能理解的。希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 2015-11-25
    • 2015-12-06
    • 1970-01-01
    • 2013-04-24
    相关资源
    最近更新 更多