C# .NET Random 生成随机数字和字母

 

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 

对象

(在

 

和大约

 

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

 

(i < 10)

 

{

 

// 

返回数字

 

return

 

i.ToString();

 

}

 

char

 

c = (char)i;

 

// 

返回小写字母加数字

 

// return char.IsLower(c) ? c.ToString() : GetChar(rnd);

 

// 

返回大写字母加数字

 

// return char.IsUpper(c) ? c.ToString() : GetChar(rnd);

 

// 

返回大小写字母加数字

 

return

 

char.IsLower(c) ? c.ToString() : GetChar(rnd);

 

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值