永发信息网

C# 有一组数,每个数出现的概率不同,如何从这组数中随机抽出几个数,怎么实现?

答案:1  悬赏:60  手机版
解决时间 2021-03-13 17:44
现在有一个集合,里面有1~10这十个确定的数字,对应每个数字的出现概率分别为:0.01,0.04,0.05, 0.1, 0.15,0.15,0.15,0.15,0.1,0.05,0.04,0.01 。如何实现按照上述概率,从这个集合中随机的抽取,不重复的5个数? 要求C# 实现!谢谢!!
最佳答案
static void Main(string[] args)
        {
            Dictionary<int, double> setting = new Dictionary<int, double>();
            setting.Add(1, 0.01);
            setting.Add(2, 0.04);
            setting.Add(3, 0.05);
            setting.Add(4, 0.1);
            setting.Add(5, 0.15);
            setting.Add(6, 0.15);
            setting.Add(7, 0.15);
            setting.Add(8, 0.15);
            setting.Add(9, 0.1);
            setting.Add(10, 0.05);
            setting.Add(11, 0.04);
            setting.Add(12, 0.01);


            List<int> list = getRandNumList(setting, 5);
        }

        /// <summary>
        /// 获取若干个不同随机数字
        /// </summary>
        /// <param name="setting">数字与出现概率的配置</param>
        /// <param name="num">获取数字个数</param>
        /// <returns></returns>
        static List<int> getRandNumList(Dictionary<int, double> setting, int num)
        {
            List<int> ret = new List<int>();
            for (int i = 0; i < num; i++)
            {
                if (setting.Count <= 0) break;
                int getKey = getRandNum(setting);   //获取单个随机数字
                setting.Remove(getKey); //从配置里去掉对应数字
                ret.Add(getKey);    //记录获取的数字
                System.Threading.Thread.Sleep(100); //随机数并不随机,不加这个随机数会比较连续
            }

            return ret;
        }

        /// <summary>
        /// 获取单个随机数字
        /// </summary>
        /// <param name="setting">数字与出现概率的配置</param>
        /// <returns></returns>
        static int getRandNum(Dictionary<int, double> setting)
        {
            double total = 0;
            foreach (int key in setting.Keys)
            {
                total += setting[key];  //计算总概率值
            }

            Random rand = new Random();
            double r = rand.NextDouble() * total;   //取一个随机数,乘以总概率值,映射到总概率值的区间内
            total = 0;
            foreach (int key in setting.Keys)
            {
                total += setting[key];  //按顺序累加概率值
                if (total > r)  //如果前面随机的数在对应区间内,则返回该数
                {
                    return key;
                }
            }

            return setting.Keys.Last<int>();    //返回最后一个数,对应rand.NextDouble()随机到1.0的情况
        }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
用面包机做面包的时候不小心把黄油和酵母放在
直埠镇中心小学地址有知道的么?有点事想过去
跪求HP同人卢修斯的BG文,不要耽美和百合的,
螨字怎么读
中国地质大学东区西二门在哪里啊,我有事要去
泰国免税店买雷达手表不准
k4081次列车票价
如果商标续展过了宽限期快两个月了还有办法补
怎样将缓存在我手机上的B站视频资源做成百度
fx专辑2015销量第一吗?
没老朱黄下一句成语
桐银路/货站路(路口)这个地址在什么地方,我
天刀萌新去老区玩好还是新区好
光阴 阅读
22*19*16的8周的孕囊是男是女帮忙看看谢谢
推荐资讯
从网吧偷了个鼠标要紧不?
劳动合同过期,但职工在单位继续上班被人打死,
哈尔滨师范大学研究生英语学科教学,这个专业
合生元积分兑物品微信上只要能搜到的都可以兑
枕边蜜语牌的售货机怎么样?
白银T+D怎么操作?在哪个银行开户好?
前几天从服务区上高速(还未上,正在上的坡上
韵香茶行怎么去啊,有知道地址的么
大众朗逸2015款1.6l自动舒适版二手车多少钱
派出所接到报警后应该多长时候到达现场
The world as i see it 的歌词
有没有做了去眼袋手术后里面有包块的姐妹?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?