假设我有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
什么算法的名称会产生这样的结果?
答案 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));
}
}