C# .NET Random 生成随机数字和字母
2016-03-15 17:29
363 查看
C# .NET Random
生成随机数字和字母
1
:随机数生成器
类
Random
是
.NET
的伪随机数生成器,
要生成各种类型的随机数,
必须先得到它的实例对
象,然后再生成随机数
2
:种子
随机数的生成是从种子值开始。
如果反复使用同一个种子,就会生成相同的数字系列,产生不
同序列的一种方法是使种子值与时间相关
3
:对象实例
默认情况下,
Random
类的无参数构造函数使用系统时钟生成其种子值
参数化构造函数可提供一个
Int32
类型的数字为起始值
4
:生成方案
方案
1
:
只实例化一个对象,多次方法调用
?
Random rnd = new
Random();
int
i1 = rnd.Next(10);
int
i2 = rnd.Next(10);
//
简单,方便,常用,生成的数字分布均匀,每个数字返回的可能性均相等。
//
一般是实例为静态对象,以减少实例化的次数,避免产生相同的种子值,如
下:
?
private
static
RNGCryptoServiceProvider rand = new
RNGCryptoServiceProvider();
方案
2
:
每次方法调用都用一个新的实例(无参)
?
Random rnd1 = new
Random();
int
i1 = rnd2.Next(10);
Random rnd2 = new
Random();
int
i2 = rnd2.Next(10);
//
两个随机数十有八九相同
//
默认种子值是从系统时钟派生而来的,具有有限的分辨率。
//
因此,通过调用默认构造函数而频繁创建的不同对象将具有相同的默认种子
值,因而会产生几组相同的随机数。
解决方案:
阻塞当前线程一小段时间
?
Random rnd1 = new
Random();
System.Threading.Thread.Sleep(500);
Random rnd2 = new
Random();
或者:应用一个算法来区分每个调用的种子值。
例如,
下面的代码使用右移位运算符为多个可以使用相同时间值初始化的
Random
对象
(在
1
和大约
28
个对象之间)生成不同的种子值。
?
int
count = 4;
Random[] rnds = new
Random[count];
for
(int
i = 0; i < count; i++)
{
rnds[i] = new
Random(unchecked((int)(DateTime.Now.Ticks >> i)));
}
5
:通用数字和字母随机生成方案
数组方式:略
字符串方式:
不灵活,但比较简便,用于验证码已足够
?
string
str =
@"0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ";
public
string
GetMix(Random rnd)
{
//
返回数字
// return rnd.Next(10).ToString();
//
返回小写字母
// return str.Substring(10+rnd.Next(26),1);
//
返回大写字母
// return str.Substring(36+rnd.Next(26),1);
//
返回大小写字母混合
// return str.Substring(10+rnd.Next(52),1);
//
返回小写字母和数字混合
// return str.Substring(0 + rnd.Next(36), 1);
//
返回大写字母和数字混合
// return str.Substring(0 + rnd.Next(36), 1).ToUpper();
//
返回大小写字母和数字混合
return
str.Substring(0 + rnd.Next(61), 1);
}
6
:用随机数填充指定字节的数组
?
Random rnd = new
Random();
//
数组长度自定义
byte[] bs = new
byte[9999];
//
字节数组的每个元素均设置为一个大于等于零而小于或等于
MaxValue
的随
机数。
MaxValue=255
,可取上界值
rnd.NextBytes(bs);
7
:生成大于等于
0.0
小于
1.0
的双精度浮点数
?
Random rnd = new
Random();
//
大于等于
0.0
并且小于
1.0
的双精度浮点数。
double
d = rnd.NextDouble();
//
格式化为
5
位小数,当然还有更多种格式化
string
s = string.Format("{0:F5}", d);
8
:生成随机整数
?
Random rnd = new
Random();
//
大于等于零且小于
MaxValue
的
32
位带符号整数。
MaxValue=2,147,483,647
,不可取上界值
int
i1 = rnd.Next();
//
大于等于零且小于
maxValue
的
32
位带符号整数,不可取上界值
int
i2 = rnd.Next(10);
//
一个大于等于
minValue
且小于
maxValue
的
32
位带符号整数,不可取上
界值,可以取负值
int
i3 = rnd.Next(-10, 100);
9
:生成随机大写字母
?
public
string
GetUpperCase(Random rnd)
{
// A-Z ASCII
值
65-90
int
i = rnd.Next(65, 91);
char
c = (char)i;
return
c.ToString();
}
10
:生成随机小写字母
?
public
string
GetLowerCase(Random rnd)
{
// a-z ASCII
值
97-122
int
i = rnd.Next(97, 123);
char
c = (char)i;
return
c.ToString();
}
11
:生成随机大小写字母混合
?
public
string
GetLetter(Random rnd)
{
// A-Z ASCII
值
65-90
// a-z ASCII
值
97-122
int
i = rnd.Next(65, 123);
char
c = (char)i;
if
(char.IsLetter(c))
{
return
c.ToString();
}
else
{
//
递归调用,直到随机到字母
return
GetLetter(rnd);
}
}
12
:生成随机大小写字母和数字混合
?
public
string
GetChar(Random rnd)
{
// 0-9
// A-Z ASCII
值
65-90
// a-z ASCII
值
97-122
int
i = rnd.Next(0, 123);
if
生成随机数字和字母
1
:随机数生成器
类
Random
是
.NET
的伪随机数生成器,
要生成各种类型的随机数,
必须先得到它的实例对
象,然后再生成随机数
2
:种子
随机数的生成是从种子值开始。
如果反复使用同一个种子,就会生成相同的数字系列,产生不
同序列的一种方法是使种子值与时间相关
3
:对象实例
默认情况下,
Random
类的无参数构造函数使用系统时钟生成其种子值
参数化构造函数可提供一个
Int32
类型的数字为起始值
4
:生成方案
方案
1
:
只实例化一个对象,多次方法调用
?
Random rnd = new
Random();
int
i1 = rnd.Next(10);
int
i2 = rnd.Next(10);
//
简单,方便,常用,生成的数字分布均匀,每个数字返回的可能性均相等。
//
一般是实例为静态对象,以减少实例化的次数,避免产生相同的种子值,如
下:
?
private
static
RNGCryptoServiceProvider rand = new
RNGCryptoServiceProvider();
方案
2
:
每次方法调用都用一个新的实例(无参)
?
Random rnd1 = new
Random();
int
i1 = rnd2.Next(10);
Random rnd2 = new
Random();
int
i2 = rnd2.Next(10);
//
两个随机数十有八九相同
//
默认种子值是从系统时钟派生而来的,具有有限的分辨率。
//
因此,通过调用默认构造函数而频繁创建的不同对象将具有相同的默认种子
值,因而会产生几组相同的随机数。
解决方案:
阻塞当前线程一小段时间
?
Random rnd1 = new
Random();
System.Threading.Thread.Sleep(500);
Random rnd2 = new
Random();
或者:应用一个算法来区分每个调用的种子值。
例如,
下面的代码使用右移位运算符为多个可以使用相同时间值初始化的
Random
对象
(在
1
和大约
28
个对象之间)生成不同的种子值。
?
int
count = 4;
Random[] rnds = new
Random[count];
for
(int
i = 0; i < count; i++)
{
rnds[i] = new
Random(unchecked((int)(DateTime.Now.Ticks >> i)));
}
5
:通用数字和字母随机生成方案
数组方式:略
字符串方式:
不灵活,但比较简便,用于验证码已足够
?
string
str =
@"0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ";
public
string
GetMix(Random rnd)
{
//
返回数字
// return rnd.Next(10).ToString();
//
返回小写字母
// return str.Substring(10+rnd.Next(26),1);
//
返回大写字母
// return str.Substring(36+rnd.Next(26),1);
//
返回大小写字母混合
// return str.Substring(10+rnd.Next(52),1);
//
返回小写字母和数字混合
// return str.Substring(0 + rnd.Next(36), 1);
//
返回大写字母和数字混合
// return str.Substring(0 + rnd.Next(36), 1).ToUpper();
//
返回大小写字母和数字混合
return
str.Substring(0 + rnd.Next(61), 1);
}
6
:用随机数填充指定字节的数组
?
Random rnd = new
Random();
//
数组长度自定义
byte[] bs = new
byte[9999];
//
字节数组的每个元素均设置为一个大于等于零而小于或等于
MaxValue
的随
机数。
MaxValue=255
,可取上界值
rnd.NextBytes(bs);
7
:生成大于等于
0.0
小于
1.0
的双精度浮点数
?
Random rnd = new
Random();
//
大于等于
0.0
并且小于
1.0
的双精度浮点数。
double
d = rnd.NextDouble();
//
格式化为
5
位小数,当然还有更多种格式化
string
s = string.Format("{0:F5}", d);
8
:生成随机整数
?
Random rnd = new
Random();
//
大于等于零且小于
MaxValue
的
32
位带符号整数。
MaxValue=2,147,483,647
,不可取上界值
int
i1 = rnd.Next();
//
大于等于零且小于
maxValue
的
32
位带符号整数,不可取上界值
int
i2 = rnd.Next(10);
//
一个大于等于
minValue
且小于
maxValue
的
32
位带符号整数,不可取上
界值,可以取负值
int
i3 = rnd.Next(-10, 100);
9
:生成随机大写字母
?
public
string
GetUpperCase(Random rnd)
{
// A-Z ASCII
值
65-90
int
i = rnd.Next(65, 91);
char
c = (char)i;
return
c.ToString();
}
10
:生成随机小写字母
?
public
string
GetLowerCase(Random rnd)
{
// a-z ASCII
值
97-122
int
i = rnd.Next(97, 123);
char
c = (char)i;
return
c.ToString();
}
11
:生成随机大小写字母混合
?
public
string
GetLetter(Random rnd)
{
// A-Z ASCII
值
65-90
// a-z ASCII
值
97-122
int
i = rnd.Next(65, 123);
char
c = (char)i;
if
(char.IsLetter(c))
{
return
c.ToString();
}
else
{
//
递归调用,直到随机到字母
return
GetLetter(rnd);
}
}
12
:生成随机大小写字母和数字混合
?
public
string
GetChar(Random rnd)
{
// 0-9
// A-Z ASCII
值
65-90
// a-z ASCII
值
97-122
int
i = rnd.Next(0, 123);
if
相关文章推荐
- C# 中方法、类的默认修饰符
- C#的装箱拆箱
- VS,C#--拼图小游戏
- C#解leetcode 16. 3Sum Closest
- C#进阶目录
- C#获取当前日期时间
- C#第十六节课
- C#软件设计——小话设计模式原则之:接口隔离原则ISP
- C#中的日期处理函数
- C# 中的"yield"使用
- C# 值类型与引用类型
- 【笔记】《C#大学教程》- 第10章 面向对象编程:多态性
- C#高级编程 (第六版) 学习 第三章:对象和类型
- Protected vs protected internal (Again) in c#
- C#通过Cookie记住登录信息
- C#第十五节课
- [Songqw.Net 基础]WPF实现简单的插件化开发
- C#中Array类
- C# IntPtr互转String
- [C#]Bencode编码算法/torrent文件解析