[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1702
  • Last Modified:

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
0
Yurich
Asked:
Yurich
  • 4
  • 4
1 Solution
 
philipjonathanCommented:
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.
0
 
YurichAuthor Commented:
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
0
 
philipjonathanCommented:
Well, I'm not a probability expert myself. But since the random generator is uniformly distributed, so there would be equal chance of you getting 50 as you getting 99. In effect that gives a task a 5% probability of getting happening.
0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
YurichAuthor Commented:
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
0
 
philipjonathanCommented:
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

0
 
YurichAuthor Commented:
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

0
 
philipjonathanCommented:
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.
0
 
YurichAuthor Commented:
thanks for confirming my thoughts :)
0

Featured Post

New feature and membership benefit!

New feature! Upgrade and increase expert visibility of your issues with Priority Questions.

  • 4
  • 4
Tackle projects and never again get stuck behind a technical roadblock.
Join Now