站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题请教一个算法

请教一个算法

摘要: 请教一个算法


有十个数,已按从小到大排序,现在要一个算法,每运行一次从中取一个数,要求值小的数机会大些,但十个数要都能取到,比如说运行100次,所取的数大部分是前几名的,该如何做?


关注


关注,随机数概率问题


难度!!!


个人想法,不知道可行不:
设个优先级,去出一次的话就减一。


功力不够,帮不上忙了
非均匀随机数的产生问题



编程到了一定地步都是数学问题,可惜我的数学没学好


我前几天做了个随机抽取考试人员的程序,但没有实现靠前的机会大些,就是随机,抽到谁就是谁,大家都公平,是C#的



public class ForeRandom
{

public static int random(int max)
{
max++;
int r = (int)(Math.random() * (1 + max) * max / 2);
int sum = 0;
for(int i = 0; i < max; i++)
{
sum += max - i;
if(r < sum)
return i;
}
return -1;
}

public static void main(String[] args)
{
for(int i = 0; i < 100; i++)
System.out.print("/t" + random(9));//0 - 9共10个数,0概率最大,9概率最小,作为数组下标就可以完成要求了。
}

}


每次产生50个随机数,比如是1-50;然后使得得到的随机数的很大一部分对应着小的数
比如:
当这个随机数是1-15的时候取第1个数
15-27时候取第二个数
……每个数对应的随机数个数逐渐少些到第10个数的时候只要5个或者6个就可以了


TO: rypgood(失魂)
good answer!
交个朋友如何: QQ: 18233296.
My pleasure !!!


mark


yingle2000(音乐天堂) 的算法确实有效(虽然看不懂),如果没有异议的话就准备结贴了


import java.util.Random;

public class Test
{
public static void main(String[] args)
{
int[] iArr = new int[100];
for (int i=0; i<100; i++)
{
int ii = doit(100);
iArr[ii] = iArr[ii] + 1;
}

for (int i=0; i<100; i++)
{
System.out.println(i + "的次数为:" + iArr[i]);
}


}

public static int doit(int max)
{
double random = Math.random();
return (int)(Math.tan(Math.PI/4*random)*max);
}

}

对于增大较小值的概率:原理就是要 形成 一条2次曲线。比如x的二次方。(斜率逐渐增大)

如果要增大较大值的概率:原理就是要形成一条类似于sin的曲线。(斜率逐渐减小)
(int)(Math.sin(Math.PI/2*random)*max);

yingle2000(音乐天堂) 正是利用了这个原理


用最简单的原理,随机数取一下对数啊,取到大数的概率非常大,这时再用总数减一下。程序就不写了


mark!


xue xi zhong ...


↑返回目录
前一篇: NEXT->...
后一篇: 数组的问题: