有十个数,已按从小到大排序,现在要一个算法,每运行一次从中取一个数,要求值小的数机会大些,但十个数要都能取到,比如说运行100次,所取的数大部分是前几名的,该如何做?
解决方案 »
- dom4j解析xml文档时候报错The content of elements must consist of well-formed character da
- Java关于窗口最大化的事件是什么
- 连个double数相乘的问题!
- 文件操作问题········
- 知道了doc文档的二进制流字符串后,如何还原为一份doc文档?
- 谈谈心啊!!!有打算考研但又想进一步学习编程的朋友进来聊聊!!!!
- 小弟是想用微软公司的VJ#开发程序可是不会连接SQL2000数据库请帮帮我 谢谢
- Field类怎么用呀???
- 新年快乐**初学者的问题**新年快乐
- 合作背单词软件
- 若[X]补=CCH,机器字长为8位,则[X/2]补=
- jdbc连接sybase出现乱码,求解???
{ 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概率最小,作为数组下标就可以完成要求了。
}}
{
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(音乐天堂) 正是利用了这个原理