读书人

关于随机数的一个算法,该如何处理

发布时间: 2012-01-05 22:36:54 作者: rapoo

关于随机数的一个算法
在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 };


Random rnd = new Random();
for (int i = 0; i < 30; i++)
{
int pos = rnd.Next(0, 30 - i);
int temp = array[pos];
array[pos] = array[30 - i - 1];

读书人网 >C#

热点推荐