首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

怎么精确的控制抽奖概率为1/2

2013-07-04 
如何精确的控制抽奖概率为1/2如题,我现在需要一个抽奖,必须控制概率为1/2,当然,有前置条件的,所以不要问为

如何精确的控制抽奖概率为1/2
如题,我现在需要一个抽奖,必须控制概率为1/2,当然,有前置条件的,所以不要问为什么要1/2这么高的概率了~~~

我使用的方法是使用随机函数Random的Next(2),并且使用RNGCryptoServiceProvider的GetBytes方法获得种子值,但是BOSS还是说概率有问题,感觉出现较小值的概率高,有没有更完美的方法~~~

        /// <summary>
        /// 根据获取抽到的奖品
        /// </summary>
        /// <param name="lotteryRules"></param>
        /// <returns></returns>
        public int GetLotteryPoints(int oldPoints)
        {
            Random random = new Random(GetRandomSeed());

            int m = random.Next(2);

            if (m == 1)
            {
                return this.MinAward;
            }
            else
            {
                return this.MaxAward;
            }
        }

        /// <summary>
        /// 获取随机种子值,防止连续快速取随机数重复问题
        /// </summary>
        /// <returns></returns>
        public static int GetRandomSeed()
        {
            byte[] bytes = new byte[4];
            System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
            rng.GetBytes(bytes);
            return BitConverter.ToInt32(bytes, 0);
        } 

random 概率?抽奖
[解决办法]
引用:
这样试试:
Random rnd = new Random(BitConverter.ToInt32(Guid.NewGuid().ToByteArray(), 0));
和初始化没关系。。

to 楼猪
system.random是一个白噪声的随机发生器,你可以加大随机数区间,比如random.next(0,100),然后以0~50为真,51~100为假,类似这样。。
至于你boss说的出现小的概率较大,那很显然是你们用的样本不够。。
我原来刚好试过random,你可以参考一下:System.Random类在极限运算环境下重复生成随机数的对比实验
[解决办法]
我猜,作为你的BOSS,他可能最为不满的是你整出了GetRandomSeed这种又慢又(看起来)乱的东西,他必须写出测试才能知道“出现较小值的概率高”。

你为什么不写一个比较普通的傻瓜化程序呢?为什么要 RNGCryptoServiceProvider 这类东西呢?

热点排行