C#中生成随机数的几种方法

摘要:
Random类Random类的默认无参数构造函数可以使用当前系统时钟作为种子来执行一系列算法,以获得伪随机数Randomrd=newRandom()rd Next这种随机数可以实现一些要求较低的目标。然而,如果Random类获取的系统时钟种子在高并发下接近或甚至相同,则很可能会重复。这里我们使用一个循环,例如{Randomrd=newRandom();Console.WriteLine;}这个例子将产生10个相同的随机数。循环完成时间很短,因此根据作为种子的系统时间计算的随机数将是相同的。
  1. Random 类

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

Random rd = new Random()
rd.next(1,10)(生成1~10之间的随机数,不包括10)

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

  for(int i=0;i<10;i++)
            {
                Random rd = new Random();
                Console.WriteLine(rd.Next(10,100).ToString());
            }

这个例子会得到10个相同的随机数,应循环完成的时间是非常短,所以根据系统时间作为种子算出的随机数就会是一样的。所以Random循环只适用于要求比较低的情况。

         2.Guid 类

System.Guid

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

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

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

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

 var uuid = Guid.NewGuid().ToString(); // 9af7f46a-ea52-4aa3-b8c3-9fd484c2af12
 var uuidN = Guid.NewGuid().ToString("N"); // e0a953c3ee6040eaa9fae2b667060e09 
 var uuidD = Guid.NewGuid().ToString("D"); // 9af7f46a-ea52-4aa3-b8c3-9fd484c2af12
var uuidB = Guid.NewGuid().ToString("B"); // {734fd453-a4f8-4c5d-9c98-3fe2d7079760}
var uuidP = Guid.NewGuid().ToString("P"); //  (ade24d16-db0f-40af-8794-1e08e2040df3)
 var uuidX = Guid.NewGuid().ToString("X"); // {0x3fa412e3,0x8356,0x428f,{0xaa,0x34,0xb7,0x40,0xda,0xaf,0x45,0x6f}}

        3.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的计算较为繁琐,在循环中使用会消耗造成大量的系统资源开销,使用时需注意.

  4.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) + "<br>");
}

结果为

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#中生成随机数的几种方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇数据报表开发技巧:自动为数据报表添加【小计】、【总计】行Centos7中 mysql5.7 用户 创建 、授权、远程登录下篇

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

相关文章

JAVA随机数生成Int、Long、Float、Double

随机数Int的生成 生成无边界的Int @Test public void testRandom_generatingIntegerUnbounded() throws Exception { int intUnbounded = new Random().nextInt(); System.out.println(intUnbounded)...

Math.radom()函数获取随机数组

Math.radom()函数获取随机数组   Math.radom()函数返回的是大于或等于0.0且小于1之间随机的double数。 利用Math.radom()函数获取随机整数数组的方法: 1 int[] source = new int[20]; 2 3 //获取随机数组 4 int i=0; 5...

安全和加密——openssl及自建CA

一、对称加密算法 对称加密:加密和解密使用共用一个秘钥 特点 加密、解密使用同一个秘钥,效率高; 将原始数据分割成固定大小的块,逐个进行加密 缺点 密钥过多,密钥需要分发 数据来源无法确认 1. 使用gpg实现对称加密 对称加密文件gpg -c file 生成 file.gpg 在另一台主机上解密gpg-o file -d file.gp...

数据仓库开发——Kettle使用示例

Kettle是一个开园ETL工具,做数据仓库用Spoon。 工具:下载Spoon,解压即可用 1、认识常用组件: 表输入 插入\更新 数据同步 文本文件输出 更新 自动文档输出 表输出 列转行 增加常量 增加序列 排序记录 行转列 过滤记录 数据库连接 合并记录 排序合并 记录关联(笛卡尔输出) 记录集连接 分组 在内存中分组 2、第一个例子 生成 10...

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=$((...

Java获取随机数的3种方法

方法1 (数据类型)(最小值+Math.random()*(最大值-最小值+1)) 例: (int)(1+Math.random()*(10-1+1)) 从1到10的int型随数 方法2 获得随机数 for (int i=0;i<30;i++) {System.out.println((int)(1+Math.random()*10));} (int...