有10个 1到100 之间的数字,比如【80, 19, 61, 99, 7, 20, 40, 31, 27, 89】.
要把这10个数字根据概率大小均匀地放在一个数组里面(上面的数字越大表示概率越大),数组长度是20(也就是数字个数X 2).结果可能像这样:
【99,89,99,89,80,99,80,61,40,31,27,。。,7】 结果数组的长度是20.java代码实现就好。多谢!
要把这10个数字根据概率大小均匀地放在一个数组里面(上面的数字越大表示概率越大),数组长度是20(也就是数字个数X 2).结果可能像这样:
【99,89,99,89,80,99,80,61,40,31,27,。。,7】 结果数组的长度是20.java代码实现就好。多谢!
解决方案 »
- java 类库里的接口(如Comparator,定义了Object类已存在的方法,这有什么意义?
- 请问高手,JMenuItem中怎样设置一个键为快捷键啊,比如F2,delete,望指教!
- 100分,帮我解释一下。
- 求java的开发工具Eclipse的资料!
- classpath 问题?
- 使用java编程,去连接华为的SYNLOCK V3设备,然后读取设备上的数据,该用什么方法?
- 请看这段程序如何运行?
- java初手,请问到那里下载java在ie下面的插件,让ie可以运行applet
- java能否动态开辟string数组?
- 关于javaIO流中PrintStream的write()和print()方法的问题
- 希望大家帮忙解决下~~呼呼 谢谢啦
- 为什么。。。高手快站出来
结果数组array2的 最后分布可能是:99出现了4次,89出现了3次,7最小可能一次都没有出现。
Math.random随机出1——21之间的任意数
如果等于1,放1进去
1——3之间,放2进去
3——6之间,放3进去
6——10之间,放4进去.....一直放满12个
80, 19, 61, 99, 7, 20, 40, 31, 27, 89
};
// 两倍长度
int[] result = new int[array.length << 1];
// 排序,其实应该降序更好,图省事先升序
Arrays.sort(array);
Random rand = new Random();
for (int i = 0; i < result.length; i++) {
// 下一次最大的N个里面候选
int n = rand.nextInt(array.length) + 1;
// 出来的索引,由于之前是升序,所以要倒过来算
int index = array.length - rand.nextInt(n) - 1;
result[i] = array[index];
} System.out.println(Arrays.toString(result));
你看是不是像这样:int [] array1 = new int[]{80, 19, 61, 99, 7, 20, 40, 31, 27, 89};
List list = new arraylist();for(int i = 0; i < array1.length; i++)
{
int j = array1[i];
while(j-- >= 0)
list.add(array1[i]);
}int m = list.size();
int[] result = new int[20];for (int i = 0; i < 20; i++)
{
double a = Math.random()*m;
a = Math.ceil(a);
int j = new Double(a).intValue();result[i]=list.get(j);
}大家看这样对吗?
int [] array1 = new int[]{80, 19, 61, 99, 7, 20, 40, 31, 27, 89};比如说80的概率就是80%, 7的概率就是7%. 所以我之前说7太小,可能一次都不会放入结果数组。
99存了3次,89存了2次,80存2次,
怎么叫均匀分布?这个地方我没表达清楚,汗!
“均匀分布”可能表达不当,其实就是99的概率是99%,那么99中的概率高,也就放入结果数组的次数就多
public static void main(String[] args) {
int[] numbers = new int[] { 80, 19, 61, 99, 7, 20, 40, 31, 27, 89 };
int[] size = new int[numbers.length];
for (int i = 0; i < size.length; i++) {
for (int j = 0; j <= i; j++) {
size[i] += numbers[j];
}
}
int[] randomNumbers = new int[numbers.length * 2];
for (int i = 0; i < randomNumbers.length; i++) {
int random = (int) (Math.random()*size[9]);
if(random<size[0]){
randomNumbers[i]=numbers[0];
}else if(random<size[1]){
randomNumbers[i]=numbers[1];
}else if(random<size[2]){
randomNumbers[i]=numbers[2];
}else if(random<size[3]){
randomNumbers[i]=numbers[3];
}else if(random<size[4]){
randomNumbers[i]=numbers[4];
}else if(random<size[5]){
randomNumbers[i]=numbers[5];
}else if(random<size[6]){
randomNumbers[i]=numbers[6];
}else if(random<size[7]){
randomNumbers[i]=numbers[7];
}else if(random<size[8]){
randomNumbers[i]=numbers[8];
}else {
randomNumbers[i]=numbers[9];
}
}
for (int i = 0; i < randomNumbers.length; i++) {
System.out.print(randomNumbers[i]+" ");
}
}
}
你的问题问的很到位,
--------------------------------
lacus87
就是原来10个数,现在要按固定的概率放入一个20个数的数组,每个数出现的概率和(这个数的值/总和)相等。
------------------------------
概率比的分母是数组1的所有数字相加的总和,分子就是每个数字。这样说应该才对。
不知道对你7楼写的代码有没有影响,
我测试了一些你的代码,我把数组1改了一下,只放3个数字:
int[] array = new int[] {99,10,89 };结果会出现:[10, 99, 99, 10, 10, 99]
这样感觉不对劲。困惑ing.....
public static void main(String[] args) {
int[] numbers = new int[] { 80, 19, 61, 99, 7, 20, 40, 31, 27, 89 };
int[] size = new int[numbers.length];
for (int i = 0; i < size.length; i++) {
for (int j = 0; j <= i; j++) {
size[i] += numbers[j];
}
}
int[] randomNumbers = new int[numbers.length * 2];
for (int i = 0; i < randomNumbers.length; i++) {
int random = (int) (Math.random()*size[size.length-1]);
for(int j = 0;j<size.length;j++){
if(random<size[j]){
randomNumbers[i]=numbers[j];
break;
}
}
}
for (int i = 0; i < randomNumbers.length; i++) {
System.out.print(randomNumbers[i]+" ");
}
}
}