随机分布计算



如果我指定一个数字,有没有办法将该数字的随机部分作为总数分配给几个组?

例如,总计1。

第1组-0.1第2组-0.3第3组-0.4第4组-0.2

在java中做这件事很简单。。。

您可以使用类似的函数生成从1到100的随机数

// min = 1 max=100 in your case
public int getRandomNumber(int min, int max) {
return (int) ((Math.random() * (max - min)) + min);
}

然后在选择元素的函数中,你会这样做。。。

第1组-0.1第2组-0.3第3组-0.4第4组-0.2

  1. 如果数字是1到10,则选择组1
  2. 如果数字是11到40,则选择组2
  3. 如果数字是41到80,则选择组3
  4. 如果数字是81到100,则选择组4

这就像计算百分比一样简单。

这能解决你的问题吗?请在评论中告诉我。

如果你不关心相同的分布,你可以只使用

void foo(){
double total = 1.0;
double[] group = new double[4];

for(int i = 0; i < group.length-1; i++){
//get random 0.0-1.0
double rand = getRandom(0.0, 1.0);
double portion = random * total
group[i] = portion;
total -= portion;
}

group[group.length-1] = total;
}

如果你真的在乎,你可以根据自己的喜好设置getRandom,例如

//get random 0.0-1.0
double rand = getRandom(1.0/group.length*0.7, 1.0/group.length * 1.3);

因此它将是平均值的70%到130%。

此方法可以将值分配给数组或"组";随机地具有该值类型,您可以将CCD_ 1与CCD_ 2或CCD_。

public void assignGroups(double[] groups, double number){
Random rand = new Random();
for(int i=0; i<groups.length-1; i++){
double randomNum  = rand.nextDouble()*number; // randomly picks number between 0 and the current amount left
groups[i] = randomNum;
number-=randomNum; // subtracts the random number from the total
}
groups[groups.length-1] = number; // sets the last value of the groups to the number left
}

Python:中

from random import random
num_groups = 5  # Number of groups
total = 5  # The given number
base = [0.] + sorted(random() for _ in range(num_groups - 1)) + [1.]
portions = [(right - left) * total for left, right in zip(base[:-1], base[1:])]

结果(print(portions)(:长度为num_groups(组数(的列表,其中包含分布式total(给定数(:

[2.5749833618941995, 0.010389749273946869, 0.3718137712569358, 0.3725336641218424, 1.6702794534530752]

使用Java:

private static double roundValue(double value, int precision) {
return (double) Math.round(value * Math.pow(10, precision))/ 
Math.pow(10, precision);
}
public static double[] generateGroups(double total, int groupsNumber, int precision){
double[] result = new double[groupsNumber];
double sum = 0;
for (int i = 0; i < groupsNumber - 1; i++) {
result[i] = roundValue((total - sum) * Math.random(), precision);
sum += result[i];
}
result[groupsNumber-1] = roundValue((total - sum), precision);
return result;
}
public static void main(String... args) {
double[] result = generateGroups(1.0, 4, 1);
System.out.println(Arrays.toString(result));
}

最新更新