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

解决方案 »

  1.   

    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概率最小,作为数组下标就可以完成要求了。
    }}
      

  2.   

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

  3.   

    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(音乐天堂) 正是利用了这个原理
      

  4.   

    xue xi  zhong  ...