我一组数字,比如
{34,23,353,324,32,113,44,22,..}
我要随便取一个出来,
并且要求根据它们的值来决定机率,
数值最小的机率最大。。我搞不定啊,请大侠教教~~~~~

解决方案 »

  1.   

    这样可以?
    P(a) = a / sum(a) , a是集合中的一个数, sum(A) 求A中元素的和。 P(a)为a的出现概率
    这样,大的数有较大的出现概率。
    然后,将数组A从小到大排序,概率从大到小排序,依次将概率付给数字。
      

  2.   

    int numbers = {34,23,353,324,32,113,44,22};
    System.Collections.ArrayList al = new System.Collections.ArrayList();
    int total = 0;
    foreach(int tmp in numbers)
    {
    total += tmp;
    for(int i=0;i<tmp;i++)
    al.Add(tmp);
    }
    System.Random rd = new Random();
    int index = rd.Next(0,total-1);

    int randomResult = Convert.ToInt32(al[index]);
      

  3.   

    由于lz对出现概率的大小并没有严格的定义,所以给出上面的算法;原理:
    根据原始数组重建一个数组,
    例如原始数组里有34,那么动态数组al里 “34”就出现34次;
    原始数组里再有23,那么动态数组al里 “23”就出现23次;依此类推,最后,从al随机取出一个元素
      

  4.   

    bobo0124(bobo0124):
    -----------------------
    这样不精确啊。
    Eddie005(♂) №.零零伍 (♂) :
    -----------------------------
    但是如果我里面有个值为100000的数字那岂不是要往新数组添加100000个元素?
      

  5.   

    使用.net自带的Random类,要影响出现的概率较为麻烦,建议lz采用别的随即算法
      

  6.   

    我的思路:
            static void Main()
            {   //为排序方便我使用了链表
                List<int> numbers = new List<int>(new int[]{ 34, 23, 353, 324, 32, 113, 44, 22 });
                numbers.Sort();//排序
                System.Random rd = new Random();
                for (int i = 0; i < 100; i++ )//循环取一百次,可以看出各个数字出现的频率
                {
                    Console.Write("{0,5}",numbers[/*下标*/area(rd.Next(0, (numbers.Count - 1) * 2), numbers.Count)]);
                }
                Console.WriteLine();
                Console.ReadLine();
            }
            //获得链表的下标,0下标站整个随机数区域的一半,1站剩下的一半,2站1剩下的一半,以此类推。
            public static int area(int rd, int length)//rd是生成的随机数,//length是链表的大小
            {
                if (rd > length) return 0;
                else
                    for (int i = length / 2, index = 1; i >= 1; i /= 2, index++)
                    {
                        if (rd > i) return index;
                    }
                return length - 1;
            }
    等更高明的算法ing
      

  7.   

    ASP.NET(c#,Ajax)技术讨论群30417196(限已工作人士)
      

  8.   

    举个例子,如果一个袋子里有一个黑球一个白球,则拿到黑球的机率就是1/2,如果有两个黑球一个白球,则取得黑球的机率就是2/3,如果有4个白球取得黑球的机率就变成了4/5,以此类推,基数越大被取道的机会也就越大。    与Eddie005(♂) №.零零伍 (♂) 的思路类似,我们都是想以增大数组中高频取出的数字的基数来实现其高频的。Eddie005(♂) №.零零伍 (♂) 增大的是数字本身,这样大大的增加了存储的开销。    我的方法是增大数组中高频取出的数的取值范围(取值范围大了,随机数落在这个范围的机率也就大了)。关键是随机数的取值范围和每个数组中数被取到的概率。为了简便,我将随机数的取值设为数组长度的一半,每个数被取出的概率设定为:最小数1/2,其次1/4,再次1/8 ...... 。