Recently I can across this problem and find it really interesting, so i thought why not write a code and share it.
There is a probability distribution given for a n sided dice in form an array. Write a code in java to simulate the roll of dice?
I came up with a solution initially which I am not proud of involving caching the outcomes and then based on that rolling the dice. But some googling pointed me finally to this Stackoverflow post:
http://stackoverflow.com/questions/5850445/simulating-a-roll-with-a-biased-dice
Which explains the algorithm for the same:
;i++) {
There is a probability distribution given for a n sided dice in form an array. Write a code in java to simulate the roll of dice?
I came up with a solution initially which I am not proud of involving caching the outcomes and then based on that rolling the dice. But some googling pointed me finally to this Stackoverflow post:
http://stackoverflow.com/questions/5850445/simulating-a-roll-with-a-biased-dice
Which explains the algorithm for the same:
4 |
In general, if your probabilities are {p1,p2, ...,p6}, construct the following helper list:
Now get a random number X in [0,1]
If
Or, more efficient pseudocode
Edit
This is equivalent to the roulette wheel selection you mention in your question update as shown in this picture:
|
I decide why don't i write a Java code for the hep of others:
package com.biplav.algorithms;
import java.util.Random;
public class WeightedDiceSimulation {
private static Random r= new Random();
public static int roll(int[] n) {
int[] wieghtedSum = new int[n.length];
wieghtedSum[0] = n[0];
for(int i=1;ilength
wieghtedSum[i] = wieghtedSum[i-1]+n[i];
}
int p = r.nextInt(100);
for(int i=0;ilength
-1;i++) {
if(p <= wieghtedSum[i])
return i+1;
else if(p > wieghtedSum[i] && p<=wieghtedSum[i+1]) {
return i+2;
}
}
return n.length;
}
public static void main(String[] args) {
int[] n = new int[] {20,30,10,0,20,20};
for(int i=0;i<10 i="" p="">
10>
System.out.println(roll(n));
}
}
}
No comments:
Post a Comment