再来写一个随机数解决方案,对Random再来一次封装
本文提供对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再来一次封装的更多相关文章
- 用Random产生1到10之间的一个随机数
bat中怎样用Random产生1到10之间的一个随机数? 当然是用%random%,示例: @echo off rem 用Random产生1到10之间的一个随机数 set num=%random% s ...
- python基础练习题(题目 输出一个随机数。)
day35 --------------------------------------------------------------- 实例050:随机数 题目 输出一个随机数. 分析:使用ran ...
- 给你一个能生成1到5随机数的函数,用它写一个函数生成1到7的随机数。 (即,使用函数rand5()来实现函数rand7())
给你一个能生成1到5随机数的函数,用它写一个函数生成1到7的随机数. (即,使用函数rand5()来实现函数rand7()). 解答 rand5可以随机生成1,2,3,4,5:rand7可以随机生成1 ...
- JAVA-集合作业-已知有十六支男子足球队参加2008 北京奥运会。写一个程序,把这16 支球队随机分为4 个组。采用List集合和随机数
第二题 已知有十六支男子足球队参加2008 北京奥运会.写一个程序,把这16 支球队随机分为4 个组.采用List集合和随机数 2008 北京奥运会男足参赛国家: 科特迪瓦,阿根廷,澳大利亚,塞尔维亚 ...
- 终于成为博客员的一员了,这是我的第一篇博文,写一个关于ul li内容宽度的问题和解决方案
第一次写博文,写一个刚才遇到的问题吧. 关于ul li文字长度不固定,一行显示多列.当指定宽度时,文字长度超过指定的li宽度时解决方案: 如下代码 <h4>发送对象(共10个会员)< ...
- *#【Python】【基础知识】【模块】【random】【使用random创造一个随机数】
Random介绍: 输出随机数. 快照: #!/usr/bin/python # -*- coding: UTF-8 -*- import random #生成 10 到 20 之间的随机数 prin ...
- JS对象随机数 random() 方法可返回介于 0 ~ 1(大于或等于 0 但小于 1 )之间的一个随机数。 注意:返回一个大于或等于 0但小于1的符号为正的数值
随机数 random() random() 方法可返回介于 0 ~ 1(大于或等于 0 但小于 1 )之间的一个随机数. 语法: Math.random(); 注意:返回一个大于或等于 0 但小于 1 ...
- 用Python写一个随机数字生成代码,5行代码超简单
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 第一步,安装 random 库 random库是使用随机数的Python标准库 ...
- 跟着PHP100第一季学写一个CMS(1-10)
笔记: 这次用的方法是先跟着视频做一遍,隔一天或半天后独立再做一遍,能发现真正不会的地方记录下来. CMS0.1界面布局1.问题:分两个css来实现时basic.css+index.php出现定位不正 ...
随机推荐
- python——面向对象相关
其他相关 一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 1 2 3 4 5 6 class Foo(object): pass obj = Foo( ...
- PHP 手册
http://www.php.net/manual/zh/index.php 感谢中文翻译工作者. PHP 手册¶ by:Mehdi Achour Friedhelm Betz Antony Dovg ...
- Redis 安装(一)
一.前言 安装 Redis 是开始 Redis 学习之旅的第一步,安装之前先来个简单的介绍. 1. 版本规则 Redis 约定次版本号(即第一个小数点后的数字)为偶数的版本是稳定版,如:2.6,2.8 ...
- Java数据类型(基本数据类型)学习
Java数据类型(基本数据类型)学习 与其他语言一样,Java编程同样存在,比如int a,float b等.在学习变量之前我就必须先了解Java的数据类型啦. Java的数据类型包括基本数据类型和引 ...
- 详解MySQL存储过程的“异常处理”
阅读目录:存储过程的异常处理 定义异常处理 单一异常处理程序 continue exit 多个异常处理程序 关于错误编号和SQLSTATE码 使用3个处理程序 忽略某一异常的处理 异常处理的命名 异常 ...
- 2016年BAT公司常见的Web前端面试题整理
1.JavaScript是一门什么样的语言,它有哪些特点? 没有标准答案. 2.JavaScript的数据类型都有什么? 基本数据类型:String,boolean,Number,Undefined ...
- pdf.js实现在HTML下直接浏览pdf文档,无需插件即可实现
近期,有一个朋友做B端,服务器存了大量的金融类数据,很多都是pdf文档,他现在的做法是,先将pdf文档转换成flash,再放到浏览器上给用户浏览,但是他告诉我,这种体验太差了,而且很好资源,空间已经快 ...
- mybatis mapper.xml 写关联查询 运用 resultmap 结果集中 用 association 关联其他表 并且 用 association 的 select 查询值 报错 java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for mybatis.map
用mybaits 写一个关联查询 查询商品表关联商品规格表,并查询规格表中的数量.价格等,为了sql重用性,利用 association 节点 查询 结果并赋值报错 商品表的mapper文件为Gooo ...
- TDE: Transparent Data Encryption brief introduction
1. What is TDE? Briefly speaking, TDE is used to encrypted data. 2. The benifits: Belows are come fr ...
- 单元测试(Spring)
单元测试是指对软件中的最小可测试单元进行的检查和验证,是软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试. 单元测试好处:提高代码质量(实现功能.逻辑 ...