C#生成随机数的三种方法

摘要:
////length://生成的密码的字符数。长度必须介于1和128个字符之间。////返回结果://指定长度的随机密码。Di&l*tY$QaMH0gyzYz^wu6{1BMq7D^+WU]˃f$1OgIJS3&09fw0F9.|aXA8F+Gy+L{O6x{SfugME*%不知是否正好符合你的要求?

随机数的定义为:产生的所有数字毫无关系.

在实际应用中很多地方会用到随机数,比如需要生成唯一的订单号.

在C#中获取随机数有三种方法:

一.Random 类

Random类默认的无参构造函数可以根据当前系统时钟为种子,进行一系列算法得出要求范围内的伪随机数.

    Random rd = new Random();
    int i = rd.Next();

这种随机数可以达到一些要求较低的目标,但是如果在高并发的情况下,Random类所取到的系统时钟种子接近甚至完全一样,就很有可能出现重复,这里用循环来举例

            for (int i = 0; i < 10; i++)
            {
                Random rd = new Random();  //无参即为使用系统时钟为种子
                Console.WriteLine(rd.Next().ToString());
            }

这个例子会输出10个相同的"随机数".

突显出的问题:因为Random进行伪随机数的算法是固定的,所以根据同一个种子计算出的数字必然是一样的.而以当代计算机的运行速度,该循环几乎是在瞬间完成的,种子一致,所以会出现10次循环输出同一随机数的情况.

二.Guid 类

System.Guid

GUID (Globally Unique Identifier) 全球唯一标识符

GUID的计算使用到了很多在本机可取到的数字,如硬件的ID码,当前时间等.所计算出的128位整数(16字节)可以接近唯一的输出.

    Console.WriteLine(Guid.NewGuid().ToString());

计算结果是xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx结构的16进制数字.当然这个格式也是可以更改的.

三.RNGCryptoServiceProvider 类

System.Security.Cryptography.RNGCryptoServiceProvider

RNGCryptoServiceProvider使用加密服务提供程序 (CSP) 提供的实现来实现加密随机数生成器 (RNG)

            RNGCryptoServiceProvider csp = new RNGCryptoServiceProvider();
            byte[] byteCsp = new byte[10];
            csp.GetBytes(byteCsp);
            Console.WriteLine(BitConverter.ToString(byteCsp));

因该类使用更严密的算法.所以即使如下放在循环中,所计算出的随机数也是不同的.

            for (int i = 0; i < 10; i++)
            {
                RNGCryptoServiceProvider csp = new RNGCryptoServiceProvider();
                byte[] byteCsp = new byte[10];
                csp.GetBytes(byteCsp);
                Console.WriteLine(BitConverter.ToString(byteCsp));
            }
但是RNGCryptoServiceProvider的计算较为繁琐,在循环中使用会消耗造成大量的系统资源开销,使用时需注意.

Membership.GeneratePassword()

Membership是一个方便快捷的进行角色权限管理的类,偶然发现一个很有意思的方法,没研究过是如何实现的

public static string GeneratePassword(int length, int numberOfNonAlphanumericCharacters);
//
// 摘要:
//     生成指定长度的随机密码。
//
// 参数:
//   numberOfNonAlphanumericCharacters:
//     生成的密码中的标点字符数。
//
//   length:
//     生成的密码的字符数。长度必须介于 1 和 128 个字符之间。
//
// 返回结果:
//     指定长度的随机密码。

例:

        for (int i = 0; i < 10; i++)
        {
            Response.Write(Membership.GeneratePassword(20, 1) + "
"); }

结果为

C!&^HoTNv3!ZHkK9BAbu

azLgER)JJ-UW8q*14yz*

I3qnb]Zxu16ht!kKZ!Q*

9U:MAQ&c1x)^aed@xe**

oL(%4JvfbP&t5*Hpl4l-

6@zj$CnhW&D+|xOf:qIk

A/!Di&l*tY$QaMH0gyzY

z^wu6{1BMq7D^+WU]>f$

1OgIJS3&09fw0F9.|aXA

8F+Gy+L{O6x{SfugME*%

不知是否正好符合你的要求?

免责声明:文章转载自《C#生成随机数的三种方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JQuery点击行tr实现checkBox选中与未选中切换C#综合揭秘——细说多线程(上)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java中取一个随机数-Random类的使用注意

使用JAVA的random类可以来产生随机数,但不要每次使用都new Random这个类对象,因为这个类是以当前系统时间来作为seed生成随机数的,如果每次都new(特别是在一个循环里面new,间隔时间非常短),那么,生成的随机数就有可能都是一样的,或是非常相近的!For example:不要这样写:for (int i = 0; i < 100;...

OpenSSL 介绍和使用

转自:https://www.jianshu.com/p/fb2ae3dc7986 一、SSL 简介 按照我的理解来解释下,为了让网络通信更安全,需要认证和加密,认证是说明你是要找的人,加密是为了让截获中间报文第三者无法得到消息内容。 为此有人设计了SSL,即套接字上的安全层,简单来说就是在TCP之上做一个安全通信层,HTTP on SSL 即是HTT...

ZH奶酪:【Python】random模块

Python中的random模块用于随机数生成,对几个random模块中的函数进行简单介绍。如下:random.random() 用于生成一个0到1的随机浮点数。如: import random random.random() 输出: 0.3701787746508932 random.uniform(a,b) 用于生成一个指定范围内的随机浮点数,两个参...

shell生成随机数的几种方法

shell生成随机数的几种方法 cat random_num.sh !/bin/bash top=10 #your number toplimit number=30 #large than top; while [ "$number" -ge $top ] do number=$RANDOM done echo "$number" number2=$((...

random_state 参数

  SVC(random_state=0)里有参数 random_state   random_state 相当于随机数种子,下面会有代码来解释其作用。图中设置了 random.seed() 就相当于在 SVC 中设置了 random_state。   没有设置 random.seed(),每次取得的结果就不一样,它的随机数种子与当前系统时间有关。 im...

sql server 函数--rand() 生成整数的随机数

rand() 定义: 返回从0到1之间的随机浮点值。 举例说明: select rand() as 随机数   结果如图: select cast( floor(rand()*N) as int )  --方法1 结果:20 select cast( ceiling(rand()*N) as int ) --方法2 结果:43 大致一看,这两种方法没什么...