我可以使用什么算法来生成“随机”值?

时间:2011-10-15 20:09:46

标签: algorithm

假设我有4个可能的结果,并且出现每个结果的概率

1 = 10%
2 = 20%
3 = 30%
4 = 40%

我想写一个像GetRandomValue这样的方法,如果调用1000次会返回

1 x 100 times
2 x 200 times
3 x 300 times
4 x 400 times

什么算法的名称会产生这样的结果?

3 个答案:

答案 0 :(得分:4)

在你的情况下你可以在1..10内生成一个随机数(int),如果它是1,那么选择1,如果它在2-3之间选择2并且如果它是在4..6之间选择3,如果在7..10之间选择4

总而言之,如果你有一些总和为1的概率,你可以在(0,1)内有一个随机数将你生成的结果分配给相关的值(在你的情况下我简化为1..10)。

答案 1 :(得分:1)

要获得随机数,您可以使用。Random类.Net。

以下内容可以满足您的要求:

public class MyRandom
{
   private Random m_rand = new Random();

   public int GetNextValue()
   {         
      // Gets a random value between 0-9 with equal probability
      // and converts it to a number between 1-4 with the probablities requested.
      switch (m_rand.Next(0, 9))
      {
         case 0:
            return 1;
         case 1: case 2:
            return 2;
         case 3: case 4: case 5:
            return 3;
         default:
            return 4;               
      }    
   }
}

答案 2 :(得分:0)

如果您只想长期运行这些概率,您可以通过从数组{1,2,2,3,3,3,4,4,4,4}中随机选择一个元素来获取值。 / p>

如果你需要准确地检索1000个元素,那么你可以尝试这样的东西(不是C#,但不应该是一个问题):

import java.util.Random;
import java.util.*;
class Thing{

    Random r = new Random();
    ArrayList<Integer> numbers=new ArrayList<Integer>();
    ArrayList<Integer> counts=new ArrayList<Integer>();
    int totalCount;

    public void set(int i, int count){    
        numbers.add(i);
        counts.add(count);
        totalCount+=count;
    }

    public int getValue(){
        if (totalCount==0)
            throw new IllegalStateException();

        double pos = r.nextDouble();

        double z = 0;
        int index = 0;

        //we select elements using their remaining counts for probabilities
        for (; index<counts.size(); index++){
            z += counts.get(index) / ((double)totalCount);
            if (pos<z)
                break;
        }

        int result = numbers.get(index);

        counts.set( index , counts.get(index)-1);
        if (counts.get(index)==0){
            counts.remove(index);
            numbers.remove(index);
        }
        totalCount--;

        return result;    
    }

}    

class Test{

    public static void main(String []args){

        Thing t = new Thing(){{
            set(1,100);
            set(2,200);
            set(3,300);
            set(4,400);
        }};

        int[]hist=new int[4];
        for (int i=0;i<1000;i++){
            int value = t.getValue();
            System.out.print(value);
            hist[value-1]++;
        }
        System.out.println();        

        double sum=0;
        for (int i=0;i<4;i++) sum+=hist[i];
        for (int i=0;i<4;i++)
            System.out.printf("%d: %d values, %f%%\n",i+1,hist[i], (100*hist[i]/sum));

    }

}