Distributed probability random number generator

前端 未结 7 1042
挽巷
挽巷 2020-12-05 10:47

I want to generate a number based on a distributed probability. For example, just say there are the following occurences of each numbers:

Number| Count               


        
7条回答
  •  情深已故
    2020-12-05 11:05

    Here's an implementation using the Inverse distribution function:

    using System;
    using System.Linq;
    
        // ...
        private static readonly Random RandomGenerator = new Random();
    
        private int GetDistributedRandomNumber()
        {
            double totalCount = 208;
    
            var number1Prob = 150 / totalCount;
            var number2Prob = (150 + 40) / totalCount;
            var number3Prob = (150 + 40 + 15) / totalCount;
    
            var randomNumber = RandomGenerator.NextDouble();
    
            int selectedNumber;
    
            if (randomNumber < number1Prob)
            {
                selectedNumber = 1;
            }
            else if (randomNumber >= number1Prob && randomNumber < number2Prob)
            {
                selectedNumber = 2;
            }
            else if (randomNumber >= number2Prob && randomNumber < number3Prob)
            {
                selectedNumber = 3;
            }
            else
            {
                selectedNumber = 4;
            }
    
            return selectedNumber;
        }
    

    An example to verify the random distribution:

            int totalNumber1Count = 0;
            int totalNumber2Count = 0;
            int totalNumber3Count = 0;
            int totalNumber4Count = 0;
    
            int testTotalCount = 100;
    
            foreach (var unused in Enumerable.Range(1, testTotalCount))
            {
                int selectedNumber = GetDistributedRandomNumber();
    
                Console.WriteLine($"selected number is {selectedNumber}");
    
                if (selectedNumber == 1)
                {
                    totalNumber1Count += 1;
                }
    
                if (selectedNumber == 2)
                {
                    totalNumber2Count += 1;
                }
    
                if (selectedNumber == 3)
                {
                    totalNumber3Count += 1;
                }
    
                if (selectedNumber == 4)
                {
                    totalNumber4Count += 1;
                }
            }
    
            Console.WriteLine("");
            Console.WriteLine($"number 1 -> total selected count is {totalNumber1Count} ({100 * (totalNumber1Count / (double) testTotalCount):0.0} %) ");
            Console.WriteLine($"number 2 -> total selected count is {totalNumber2Count} ({100 * (totalNumber2Count / (double) testTotalCount):0.0} %) ");
            Console.WriteLine($"number 3 -> total selected count is {totalNumber3Count} ({100 * (totalNumber3Count / (double) testTotalCount):0.0} %) ");
            Console.WriteLine($"number 4 -> total selected count is {totalNumber4Count} ({100 * (totalNumber4Count / (double) testTotalCount):0.0} %) ");
    

    Example output:

    selected number is 1
    selected number is 1
    selected number is 1
    selected number is 1
    selected number is 2
    selected number is 1
    ...
    selected number is 2
    selected number is 3
    selected number is 1
    selected number is 1
    selected number is 1
    selected number is 1
    selected number is 1
    
    number 1 -> total selected count is 71 (71.0 %) 
    number 2 -> total selected count is 20 (20.0 %) 
    number 3 -> total selected count is 8 (8.0 %) 
    number 4 -> total selected count is 1 (1.0 %)
    

提交回复
热议问题