Link to home
Start Free TrialLog in
Avatar of Yurich
YurichFlag for New Zealand

asked on

Calculating Probability using C#

Hello,

I'm wondering how to approach a problem of calculating probability in C#.
Lets say, we know that some task has a 5% probability of happening and there're say 100 identical tasks. So theoretically, 5 tasks should happen, but as those tasks are individual tasks, each task has a 5% probability of happening. So, how can I simulate this case using programming?

I presume that I can get 5 random number using Random class (Random rand = new Random(); rand.Next(1, 100)), and then get another 100 numbers and see if any number is in the set I generated first. But in this case, it's not truly random as generating first 5 numbers can use all "random potential" of these numbers and they will happened to be generated again.

Is there any accurate way of doing it?

Thanks
Avatar of philipjonathan
philipjonathan
Flag of New Zealand image

How about this:
For each task, generate a random number between (1 to 100), and check if the number is > 95. Assuming that the random generator is uniformly distributed (which it claims so), then there is a 5% probability that the task gets > 95. Repeat this for every task.
Avatar of Yurich

ASKER

yes, I was initially thinking about doing something like that, but just checking if those numbers are from 1 to 5. But that seems to me not very random as for this particular run, all numbers can happen to be from 5 to 100. That's why I started to think about generating random 5 numbers first, rather than using any particular sets (1-5, 20-25, 96-100, etc).

Thanks
ASKER CERTIFIED SOLUTION
Avatar of philipjonathan
philipjonathan
Flag of New Zealand image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of Yurich

ASKER

Just wrote a quick piece of code to check this theory and in fact, greater the number of repetitions, more chances of evenly spreading of the results. I'll keep it open for a while in case someone has a different approach, but I will probably just do as I first intended (and as phillip suggested).

cheers
Hmm, seems like we think alike, I've just run my own test as well. The test code is as attached. Basically I run 10000 times of set of 100. For each run (100 numbers), I note down the number of yes and no. Granted that sometimes, there are > 5 yes, sometimes there are < 5 yes. But with 10000 times run, the result average out to about 5 (in my test it's 4.95xxx)
        static void Main(string[] args)
        {
            Random g = new Random();
            int avg = 0;
            for (int i = 0; i < 10000; i++)
            {
                int yes = 0;
                int no = 0;
                for (int j = 0; j < 100; j++)
                {
                    int x = g.Next(0, 100);
                    if (x >= 95)
                        yes++;
                    else
                        no++;
                }
                System.Diagnostics.Debug.WriteLine(string.Format("Yes {0} No {1}", yes, no));
                avg += yes;
            }
            System.Diagnostics.Debug.WriteLine(string.Format("Avg {0}", avg));
        }

Open in new window

Avatar of Yurich

ASKER

lol,

I've done a bit different thing, but for 100,000 runs, distribution is very even. The code is attached; each number in "groups" is a segment of 5 numbers (1-5, 6-10, etc.)
    protected void Page_Load(object sender, EventArgs e)
    {
		Random rand = new Random();
 
		int[] groups = new int[ 20 ];
		int number = 0;
 
		for( int i = 0; i < 100000; i++ )
		{
			number = rand.Next( 0, 100 );
			groups[ number / 5 ]++;
		}
 
		for( int i = 0; i < 20; i++ )
		{
			Response.Write( Math.Round( ( double )groups[ i ] / 100000, 2 ) + "<br/>" );
		}
 
    }

Open in new window

Yup, I ran your code and saw that the distribution is very even, I even had to increase the number of decimal points just to ensure that I'm seeing the real thing. I think this is expected because the random generator is evenly distributed.
Avatar of Yurich

ASKER

thanks for confirming my thoughts :)