C#中获取、生成随机数的三种方法
作者:junjie 发布时间:2022-02-24 07:48:12
随机数的定义为:产生的所有数字毫无关系.
在实际应用中很多地方会用到随机数,比如需要生成唯一的订单号.
在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) + "<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*%
不知是否正好符合你的要求?
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- SpringBoot整合第三方技术一、整合Junit新建一个SpringBoot项目使用@SpringBootTest标签在test测试包内
- 语法糖(Syntactic sugar)是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中
- tjxCold(根据配置模板,快速生成controller,service,serviceimpl 代码) 为什么要开发这款插件市面上有很多
- 1、什么是hashCodehashCode就是对象的散列码,是根据对象的某些信息推导出的一个整数值,默认情况下表示是对象的存储地址。通过散列
- Prim算法介绍1.点睛在生成树的过程中,把已经在生成树中的节点看作一个集合,把剩下的节点看作另外一个集合,从连接两个集合的边中选择一条权值
- 一、@Value读取application.properties配置文件中的值application.properties配置文件fileN
- 本文栈长教你如何在 Spring Boot 注册 Servlet、Filter、Listener。一、Spring Boot 注册Sprin
- 废话少说,直接上代码:ehcache.xml 文件<?xml version="1.0" encoding=&qu
- 前言研究表明,Java堆中对象占据最大比重的就是字符串对象,所以弄清楚字符串知识很重要,本文主要重点聊聊字符串常量池。Java中的字符串常量
- 在开发的过程中,往往会需要在组件中添加一些按钮,用于执行一些自定义的操作。例如你有一个组件A,里面有一个List<Collider&g
- 经过上一篇的介绍,相信小伙伴们已经按奈不住内心对springboot的向往,本篇我将继续向小伙伴介绍springboot配置文件的配置,已经
- 导入maven依赖<!-- https://mvnrepository.com/artifact/com.fasterxml.jack
- 在Android中,线程内部或者线程之间进行信息交互时经常会使用消息,这些基础的东西如果我们熟悉其内部的原理,将会使我们容易、更好地架构系统
- 这篇文章主要介绍了Java JDBC导致的反序列化攻击原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- springboot 启动找不到主类利用eclipse的maven插件,清理了了一下springboot的项目,结果再启动就找报找不到主类的
- 方式一public class Test{ public static void main(String[] args) throws Ex
- SpringBoot是什么?SpringBoot是spring家族中微型框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。
- 网页爬虫:其实就是一个程序用于在互联网中获取符合指定规则的数据。package day05; import java.io.Buffered
- 1.两种取值方式的差异mapper.xml映射文件<select id="selectEmployeeByCondition
- 项目演示演示中只用一个用户登录,只是为了测试功能,实际使用中是根据数据库表内数据来决定的。1 创建工程完成配置1 ieda新建maven项目