Java 如何在一个数组中生成随机数,并将其相加为定义的总数?
我需要在Java中随机生成一个包含7个插槽的数组。所有这些插槽的值必须至少为1,但组合起来的总值必须为另一个定义的数字。它们也都需要是一个int值,1.5或0.9816465684646。 例如:Java 如何在一个数组中生成随机数,并将其相加为定义的总数?,java,arrays,algorithm,random,Java,Arrays,Algorithm,Random,我需要在Java中随机生成一个包含7个插槽的数组。所有这些插槽的值必须至少为1,但组合起来的总值必须为另一个定义的数字。它们也都需要是一个int值,1.5或0.9816465684646。 例如: 我希望它生成类似的结果,但是如果int a=15,所有的数字将以任何顺序总共15个实现一致性的一个好方法是,例如,将a=15单位填充到一个8元素数组中: 在数组中的每个元素中放入1,因为这是您的需求,现在您还有7个值要分配 在0和数组的最大索引之间滚动一个随机数,将该元素加1,然后从7中减去1。这样做
我希望它生成类似的结果,但是如果int a=15,所有的数字将以任何顺序总共15个实现一致性的一个好方法是,例如,将
a=15
单位填充到一个8元素数组中:
通过这种方式,您将通过使每个元素的最小值为1来满足您的最小条件。然后以完全随机的方式分配剩余的总数。生成N个随机数并添加到给定总和的标准方法是将你的总和视为一条数字线,在该线上生成N-1个随机点,对它们进行排序,然后使用点之间的差作为最终值。要得到最小值1,首先从总和中减去N,运行给定的算法,然后将1加回到每个段
public class Rand {
public static void main(String[] args) {
int count = 8;
int sum = 100;
java.util.Random g = new java.util.Random();
int vals[] = new int[count];
sum -= count;
for (int i = 0; i < count-1; ++i) {
vals[i] = g.nextInt(sum);
}
vals[count-1] = sum;
java.util.Arrays.sort(vals);
for (int i = count-1; i > 0; --i) {
vals[i] -= vals[i-1];
}
for (int i = 0; i < count; ++i) { ++vals[i]; }
for (int i = 0; i < count; ++i) {
System.out.printf("%4d", vals[i]);
}
System.out.printf("\n");
}
}
公共类{
公共静态void main(字符串[]args){
整数计数=8;
整数和=100;
java.util.Random g=new java.util.Random();
整数VAL[]=新整数[计数];
总和-=计数;
对于(int i=0;i0;--i){
vals[i]=vals[i-1];
}
对于(int i=0;i
我的java很糟糕,所以我这里不提供实际的代码,因为它可能是错误的。我以前在SQL中做过同样的事情,所以我知道它是有效的
再加上@Kon所说的,你可以使用两个随机数而不是一个随机数来获得更多的随机性。即:
Fill every element in the array with the value 1
valuesToDistribute = a - array.length-1
randomIndex = Roll a number between 0 and array.length-1
randomValue = Roll a number between 1 and valuesToDistribute
Add to randomIndex the value randomValue
Subtract randomValue from valuesToDistribute
Repeat until valuesToDistribute = 0
这甚至可能值得一个
算法tag.OP,你知道随机变量和概率分布吗?这个问题只有在你更准确地定义“随机”的含义后才能得到答案。+1,没有更好的解决方案。我在思考如何获得一致性。我的困境是他们可能太统一了。对于一个足够大的a,所有的数字都会非常接近,很难判断是否存在随机性。那么,我将如何改变你所说的,使其成为一个7元素数组?我只需要7个数字。当你的总和很大时,这会表现得很糟糕。@LeedianelCrocker操作员说他的值不会超过99。当a
很大时,这会很慢。一个更有效的解决方案是Lee Daniel Crocker所描述的。这很有趣。你能展示一点代码,让我看看会发生什么吗?是的,我可能应该展示一些代码。给我几分钟。这是一个很好的方法,但当数字被限制为整数时,问题就更难了。魔鬼将出现在细节中。@TedHopp我不知道为什么整体性会产生问题。两个数字之间的平均差值仍然是N/sum
Fill every element in the array with the value 1
valuesToDistribute = a - array.length-1
randomIndex = Roll a number between 0 and array.length-1
randomValue = Roll a number between 1 and valuesToDistribute
Add to randomIndex the value randomValue
Subtract randomValue from valuesToDistribute
Repeat until valuesToDistribute = 0