总结全网C#取随机数方法(整型,浮点型,字符串)
原文链接:https://blog.csdn.net/m0_65636467/article/details/127770112
C#取随机数(Random篇)
一、整数随机数
1 2 3 4 5 6 | //10以内的随机整数 Random rd= new Random(); int n = ran.Next(10); //1-100的随机整数 int p = rd.Next(1, 100); //大于等于1小于100的整数 |
int Next(int minValue, int maxValue);
官方摘要:返回在指定范围内的任意整数。
参数说明:
minValue:返回的随机数字包含下限。 maxValue:返回随机数的不含上限。 maxValue必须大于或等于minValue。
返回结果:32 位有符号的整数大于或等于minValue和小于maxValue;即,返回值的范围 包括minValue但是不包含maxValue。
二、字符和布尔随机数
固定字符串随机取
1 2 3 4 5 6 7 8 9 10 11 | //固定字符串随机取(如:点名器) public string Get_stringRandom( string [] arr) { Random ran = new Random(); int n = ran.Next(arr.Length - 1); return arr[n]; } //调用方法: string [] arr = { "abc" , "green" , "Tom" , "C#" , "java" }; Get_stringRandom(arr); |
随机获取布尔值
1 2 3 4 5 6 7 8 9 10 | //随机获取布尔值 public bool Generate_boolRandom() { bool [] arr = { true , false }; Random ran = new Random(); return arr[ran.Next(2)]; } //调用方法: Response.Write(Generate_boolRandom()); |
Random ran = new Random();
ran.Next(num);//取0-num之间的整数包括0不包括num
生成一个随机字符串(支持英文大小写字母/数字混合)
参数:
n字符数量;
number: 是否包含数字;
Lowercase:是否包含小写英文字母
capital:是否包含大写英文字母
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public static string GetRandomCharacters( int n = 10, bool Number = true , bool Lowercase = true , bool Capital = true ) // 生成随机字符串 { StringBuilder tmp = new StringBuilder(); Random rand = new Random(); string characters = (Capital ? "ABCDEFGHIJKLMNOPQRSTUVWXYZ" : null ) + (Number ? "0123456789" : null ) + (Lowercase ? "abcdefghijklmnopqrstuvwxyz" : null ); if (characters.Length < 1) { return ( null ); } for ( int i = 0; i < n; i++) { tmp.Append(characters[rand.Next(0, characters.Length)].ToString()); } return (tmp.ToString()); } |
调用函数运行截图:
简化版
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | /// <summary> /// 获取随机字符串 /// </summary> /// <param name="n">长度</param> /// <param name="b">是否特殊字符</param> /// <returns></returns> public string GetRandomStr( int n, bool b = false ) { string str = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" ; if (b) { str += "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~" ; //复杂字符 } StringBuilder sb = new StringBuilder(); Random rd = new Random(); for ( int i = 0; i < n; i++) { sb.Append(str.Substring(rd.Next(0, str.Length), 1)); } return sb.ToString(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public string randString() { string str = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~!@#$%^&*()_+" ; //75个字符 Random r = new Random(); string result = string .Empty; //生成一个8位长的随机字符,具体长度可以自己更改 for ( int i = 0; i < 8; i++) { int m = r.Next(0, 75); //这里下界是0,随机数可以取到,上界应该是75,因为随机数取不到上界,也就是最大74,符合我们的题意 string s = str.Substring(m, 1); result += s; } return result; } |
方法二
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public static string Gen_string( double Min, double Max) { StringBuilder str = new StringBuilder(); char c; for ( int i = ( int )Min; i <= ( int )Max; i++) { //生成随机数时每次循环生成的数是一样的,循环中计算时间太快 //利用Guid.NewGuid().GetHashCode()返回的哈希代码得到种子,得到不重复的值 Random random = new Random(Guid.NewGuid().GetHashCode()); c = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))); str.Append(c); } return str.ToString(); } |
// Min为最小长度,Max为最大长度
math.floor(x),math函数库中的一个函数,返回小于参数x的最大整数,即对浮点数向下取整。x[]的取值。
Convert.ToInt32() 可以将多种类型(包括 object 引用类型)的值转换为 int 类型,因为它有许多重载版本[2]:
public static int ToInt32(object);
public static int ToInt32(bool);
public static int ToInt32(byte);
public static int ToInt32(char);
public static int ToInt32(decimal);
public static int ToInt32(double);
public static int ToInt32(short);
public static int ToInt32(long);
public static int ToInt32(sbyte);
public static int ToInt32(string);
在循环中使用
Random y = new Random();
生成随机数时每次循环生成的数是一样的。
这是因为生成随机数的时候,计算时间太快导致的问题,如何去解决这里也很简单,只需要在上述代码Random括号里面添加上Guid.NewGuid().GetHashCode()
Random random = new Random(Guid.NewGuid().GetHashCode());
或者 // 给一个时间种子,防止重复
Random random = new Random(~unchecked((int)DateTime.Now.Ticks));
三、浮点型随机数
随机生成浮点数
1 2 3 4 | public static double NextDouble(Random rd, double Min, double Max) { return rd.NextDouble() * (Max - Min) + Min; } // 结果示例 2.30927768119112 |
随机生成浮点数(保留n位小数)
1 2 3 4 5 6 7 8 9 10 | public double NextDouble(Random ran, double minValue, double maxValue, int n) { double randNum = ran.NextDouble() * (maxValue - minValue) + minValue; return Convert.ToDouble(randNum.ToString( "f" + n)); } //调用: Random ran = new Random(); double randNum = NextDouble(ran, 3.16, 7.28, 2); // 保留两位小数 Response.Write(randNum); // 结果示例 5.32 |
也可调用此类方法保留小数位
1 2 3 4 5 | public static double Num3( double num) { num = Math.Floor(num * 1000) / 1000; //乘1000向下取整再除1000,保留三位小数 return num; } |
★★★各种方法优缺点总结(重要)★★★
System.Random
这个是伪随机数生成器
缺点:生成出来的结果会循环,且Random对象创建间隔小于1ms的时候产生结果会相同; 优点:生成速度极快;
效率:高,同一个对象产生1,000,000个结果只需要22ms(不含对象创建时间)
System.Security.Cryptography.RandomNumberGenerator
这个是用于产生密码的安全随机数生成器,产生出来的随机数离散度高,产生1,000,000个32位(8-byte)的随机数无重复
缺点:速度很慢,对比System.Random是两个数量级的效率差距;
优点:安全度高,产生的结果可看作环境无关,而且可以填充任意长度的字节数组;
效率:低,同一个对象产生1,000,000个结果需要4221ms(不含对象创建时间)
System.Guid
这个是GUID(UUID)生成器,出来的是128-bit的字节数组,通常被表示为8-4-4-4-12的32个hex字符。
缺点:生成长度一定,而且生成出来的结果可能与环境相关,在高安全需求的环境不适用;
优点:有强大的数学理论支持,在每秒产生10亿笔UUID的情况下,100年后只产生一次重复的机率是50%;
效率:中,产生1,000,000个结果需要255ms(包含Guid对象创建时间)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2023-05-22 检索COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件失败,错误: 80080005
2023-05-22 VS2015设置网站/WebSite的启动端口