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()];
我有一个数组,我想 "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()];