日期:2014-05-18  浏览次数:20989 次

关于随机数的一个算法
在1~9之间产生30个随机数.
1,2,3,6,7,9的个数分别是4
4,5,8的个数分别是2

谢谢.


------解决方案--------------------
把这30个数存到数组里去,随机取出来就是了..
------解决方案--------------------
没有办法那么准确,否则就不叫随机了,

做法可以如下

1,2,3,6,7,9 每个的次数都是 4
因此可以认为他们的概率为 4.0/30 = 0.1333333...3 把他约等于 0.1333

4,5,8 每个的次数都 是2
因此可以认为他的 概率为,2.0/30 = 0.0666666...6 把他约等于 0.0666

C# code

        private int GetValue()
        {
            Random r = new Random();
            int value = r.Next( 1, 10000 );
            if ( value >= 1 && value <= 1333 )
                return 1;    // 13.33的概率是 1
            else if ( value >= 1334 && value <= 2666 )
                return 2;    // 13.33的概率是 2
            else if ( value >= 2667 && value <= 3999 )
                return 3;    // 13.33的概率是 3
            else if ( value >= 4000 && value <= 5332 )
                return 6;    // 13.33的概率是 6
            else if ( value >= 5333 && value <= 6665 )
                return 7;    // 13.33的概率是 7
            else if ( value >= 6666 && value <= 7998 )
                return 9;    // 13.33的概率是 9
            else if ( value >= 7999 && value <= 8665 )
                return 4;    // 6.6  的概率是 4
            else if ( value >= 8666 && value <= 9332 )
                return 5;    // 6.6  的概率是 5
            else
                return 8;    // 6.67 的概率是 8
        }

------解决方案--------------------
C# code

public static void test2()
        {
            /*
            在1~9之间产生30个随机数. 
            1,2,3,6,7,9的个数分别是4 
            4,5,8的个数分别是2  
             */
            //存放最后的结果
            int[] number = new int[30];
            //每个数字出现次数的限制
            int[] limit = new int[10] { 0, 4, 4, 4, 2, 2, 4, 4, 2, 4 };
            //记录每个数字已出现的次数
            int[] count = new int[10];
            for (int i = 0; i < count.Length; i++)
            {
                count[i] = 0;
            }
            Random r = new Random();
            int index = 0;
            while(index<30)
            {
                int n = r.Next(1, 10);
                
                if (count[n] < limit[n])
                {
                    count[n]++;
                    number[index++] = n;
                }
            }

            for (int i = 0; i < 30; i++)
            {
                System.Console.Write(number[i] + " ");
            }

        }

------解决方案--------------------
up
------解决方案--------------------
二楼很不错!!!
------解决方案--------------------
2楼
------解决方案--------------------
4楼的方法是准确的
完全能达到楼主的要求
------解决方案--------------------
2楼的方法在有限的数据下够帅
------解决方案--------------------
顶2楼
------解决方案--------------------
不错
------解决方案--------------------
up
------解决方案--------------------
2楼帅
------解决方案--------------------
这方法好,嘿嘿
探讨
写一下,这样就可以把数组打乱...

C# code int[] array = { 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9 };