本文提供对Random的封装,简化并扩展了其功能

  • 获取随机数,确保同时调用不会重复

     //new Random().Next(5);
    RandomTask.Next();
  • 从一个列表中,随机获取其中某个值

                List<string> lsTest = new List<string>
    {
    "","","","",""
    };
    string randomValue = RandomTask.PickOne(lsTest);
    Console.WriteLine(randomValue);
  • 从一个列表中,随机获取其中多个值
    List<string> someRandomValue = RandomTask.PickAny(lsTest, );
    Console.WriteLine(string.Join(",", someRandomValue));
  • 想按某个概率返回bool值,可以这么写
                bool is30Per = RandomTask.PickBoolByProp(0.3);
    Console.WriteLine(is30Per);
  • 最复杂的,一个list中有a,b两个数据,a按照70%概率返回而b按30%返回,就这样写
                Dictionary<string, double> lsTestAB = new Dictionary<string, double>
    {
    {"A",0.7 },
    { "B",0.3}
    };
    string aOrb = RandomTask.PickOneByProb(lsTestAB);
    Console.WriteLine(aOrb);
  • 源码
        public static class RandomTask
    {
    private static readonly Random _random = new Random(); public static int Next()
    {
    lock (_random)
    {
    return _random.Next();
    }
    } public static int Next(int max)
    {
    lock (_random)
    {
    return _random.Next(max);
    }
    } public static int Next(int min, int max)
    {
    lock (_random)
    {
    return _random.Next(min, max);
    }
    } /// <summary>
    /// 按概率获取
    /// </summary>
    /// <param name="trueProp"></param>
    /// <returns></returns>
    public static bool PickBoolByProp(double trueProp = )
    {
    if (trueProp > )
    {
    trueProp = ;
    }
    if (trueProp < )
    {
    trueProp = ;
    }
    Dictionary<bool, double> wt = new Dictionary<bool, double>
    {
    { true , trueProp },
    { false , - trueProp }
    };
    return wt.PickOneByProb();
    } /// <summary>
    /// 按指定概率获取随机结果
    /// </summary>
    /// <param name="sourceDic">a 0.8 b 0.1 c 0.1</param>
    /// <returns>随机结果 [a,b,c]</returns>
    public static T PickOneByProb<T>(this Dictionary<T, double> sourceDic)
    {
    if (sourceDic == null || !sourceDic.Any())
    {
    return default(T);
    } int seed = (int)( / (sourceDic.Values.Where(c => c > ).Min()));
    int maxValue = sourceDic.Values.Aggregate(, (current, d) => current + (int)(seed * d)); int rNum = Next(maxValue);
    int tem = ;
    foreach (KeyValuePair<T, double> item in sourceDic)
    {
    tem += (int)(item.Value * seed);
    if (tem > rNum)
    {
    return item.Key;
    }
    }
    return default(T);
    } /// <summary>
    /// 随机从List中获取一项
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="source"></param>
    /// <returns></returns>
    public static T PickOne<T>(this List<T> source)
    {
    if (source == null || !source.Any())
    {
    return default(T);
    }
    return source[Next(source.Count)];
    } /// <summary>
    ///
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="source"></param>
    /// <param name="c"></param>
    /// <returns></returns>
    public static List<T> PickAny<T>(this List<T> source, int c)
    {
    if (source == null || !source.Any())
    {
    return default(List<T>);
    }
    if (source.Count <= c)
    {
    return source;
    }
    List<T> ls = new List<T>();
    for (int i = ; i < c; i++)
    {
    var t = source.PickOne();
    if (!ls.Contains(t))
    {
    ls.Add(t);
    }
    }
    return ls;
    }
    }
  • 大家试试吧,真的挺好用的

再来写一个随机数解决方案,对Random再来一次封装的更多相关文章

  1. 用Random产生1到10之间的一个随机数

    bat中怎样用Random产生1到10之间的一个随机数? 当然是用%random%,示例: @echo off rem 用Random产生1到10之间的一个随机数 set num=%random% s ...

  2. python基础练习题(题目 输出一个随机数。)

    day35 --------------------------------------------------------------- 实例050:随机数 题目 输出一个随机数. 分析:使用ran ...

  3. 给你一个能生成1到5随机数的函数,用它写一个函数生成1到7的随机数。 (即,使用函数rand5()来实现函数rand7())

    给你一个能生成1到5随机数的函数,用它写一个函数生成1到7的随机数. (即,使用函数rand5()来实现函数rand7()). 解答 rand5可以随机生成1,2,3,4,5:rand7可以随机生成1 ...

  4. JAVA-集合作业-已知有十六支男子足球队参加2008 北京奥运会。写一个程序,把这16 支球队随机分为4 个组。采用List集合和随机数

    第二题 已知有十六支男子足球队参加2008 北京奥运会.写一个程序,把这16 支球队随机分为4 个组.采用List集合和随机数 2008 北京奥运会男足参赛国家: 科特迪瓦,阿根廷,澳大利亚,塞尔维亚 ...

  5. 终于成为博客员的一员了,这是我的第一篇博文,写一个关于ul li内容宽度的问题和解决方案

    第一次写博文,写一个刚才遇到的问题吧. 关于ul li文字长度不固定,一行显示多列.当指定宽度时,文字长度超过指定的li宽度时解决方案: 如下代码 <h4>发送对象(共10个会员)< ...

  6. *#【Python】【基础知识】【模块】【random】【使用random创造一个随机数】

    Random介绍: 输出随机数. 快照: #!/usr/bin/python # -*- coding: UTF-8 -*- import random #生成 10 到 20 之间的随机数 prin ...

  7. JS对象随机数 random() 方法可返回介于 0 ~ 1(大于或等于 0 但小于 1 )之间的一个随机数。 注意:返回一个大于或等于 0但小于1的符号为正的数值

    随机数 random() random() 方法可返回介于 0 ~ 1(大于或等于 0 但小于 1 )之间的一个随机数. 语法: Math.random(); 注意:返回一个大于或等于 0 但小于 1 ...

  8. 用Python写一个随机数字生成代码,5行代码超简单

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 第一步,安装 random 库 random库是使用随机数的Python标准库 ...

  9. 跟着PHP100第一季学写一个CMS(1-10)

    笔记: 这次用的方法是先跟着视频做一遍,隔一天或半天后独立再做一遍,能发现真正不会的地方记录下来. CMS0.1界面布局1.问题:分两个css来实现时basic.css+index.php出现定位不正 ...

随机推荐

  1. AngularJS入门教程:日期格式化

    AngularJS入门教程:日期格式化[转载] 本地化日期格式化: ({{ today | date:'medium' }})Nov 24, 2015 2:19:24 PM ({{ today | d ...

  2. Javascript中call和apply

    在上一章http://www.cnblogs.com/meiyh/p/6207671.html 我有提到javascript很重要的this关键字,现在我们结合这个关键字使用的下面的两个关键字: ca ...

  3. 通过 jdbc 分析数据库中的表结构和主键外键

    文章转自:http://ivan4126.blog.163.com/blog/static/20949109220137753214811/ 在某项目中用到了 hibernate ,大家都知道 hib ...

  4. get和post提交数据的区别

    get是客户端向服务器索取数据的请求,设定的初衷是,客户端(浏览器)给服务器发送请求,然后服务器再返回给客户端其要求的数据. 那么为什么说get也能提交数据呢? 我们仔细理解第一句话“客户端(浏览器) ...

  5. 【DP系列学习一】简单题:kickstart2017 B.vote

    https://code.google.com/codejam/contest/6304486/dashboard#s=p1 这是一道简单的dp,dp[i][j]代表A的voter为i,B的voter ...

  6. Oracle的正则应用之匹配出手机号

    按照要求匹配出符合中国大陆手机号规则的数据 --1 表准备create table test_regexp( object varchar2(50)); --2 数据准备 insert into te ...

  7. vector作为参数的三种传参方式

    c++中常用的vector容器作为参数时,有三种传参方式,分别如下(为说明问题,用二维vector): function1(std::vector<std::vector<int> ...

  8. hdu2159 FATE 经典二维背包

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2159 思路: 定义ans存当前满足条件的消耗的最小的忍耐值(满足条件的忍耐值为在当前消耗的忍耐值的情况 ...

  9. PyCharm的小技巧

    PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如:代码跳转.智能提示.自动完成.单元测试.版本控制.此外,该IDE提供了一些高级功能, ...

  10. C#特性:从自定义一个特性开始,谈谈什么是特性

    作为C#新手中的一员,我刚开始接触特性时,那真是一脸冏逼啊,怎么想怎么查资料都没弄明白它到底是个什么东西,有的入门教程甚至都没讲特性和反射这些概念!相信很多人第一次接触到特性就是关于系列化的知识了. ...