Random快速产生相同随机数的原因及解决方案
老生常谈,还是那三句话:
学历代表你的过去,能力代表你的现在,学习代表你的将来
十年河东,十年河西,莫欺少年穷
学无止境,精益求精
问题描述:很多时候我们可能需要在极短的时间内生成大量的随机数,但是你可能会发现生成了很多重复的随机数。并不是你所希望生成大量不同的数,或者说相同的数极少。
分析原因:Random是主要产生伪随机数的类,它主要包括两个构造函数(无参构造函数和带一个Int32类型参数的构造函数),无参构造函数主要采用系统时间作为随机种子,带参数的构造函数需要自己去指定随机种子。而在很短的时间内生成大量随机数的时候,由于时间相当短暂,很大的可能性一部分随机数生成时,取到作为随机种子的系统时间相同,因此产生出来的随机数就相同了。
解决方案:既然知道原因何在了,解决方案就可以出来了。要生成不同的随机数,我们只需要保证随机种子尽可能不重复(不能完全保证不重复)即可。Random类有两个构造函数,我们就可以考虑用两种方法去解决这个问题。(有更好、更多的解决办法的朋友,告诉我一声了,呵呵~~)
- 利用无参构造函数,既然它是采用系统时间作为随机种子,而取到的系统时间相同,才造成生成了重复的随机数,因此我们可以在生成一个随机数后延时一段时间,让它下次不取到相同的系统时间,这样随机种子也就不相同了。延时可以考虑使用Thread.Sleep(100),这里是延时0.1秒。
- 利用带参构造函数,我们想办法去生成尽可能不重复的随机种子。注意到MSDN中介绍Random.NextBytes()方法时,有这样一句话“要生成适合于创建随机密码的加密安全随机数,请使用如 RNGCryptoServiceProvider.GetBytes 这样的方法。”,它包含的意义是微软已经有现成的东西生成随机的密码,那我们就可以拿来用用了。我们就用它来生成我们的随机种子。
可以写一个生成随机种子的方法,代码如下:
在此,贴下用法:
public int GetRandSeed()
{
byte[] bytes = new byte[];
System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
rng.GetBytes(bytes);
return BitConverter.ToInt32(bytes, );
}
然后再贴出一个具体应用。
生成固定前缀的身份证号(北京市市辖区身份证开头 110100):
#region 生成身份证号
/// <summary>
/// 身份证后四位
/// </summary>
/// <param name="codeLength"></param>
/// <returns></returns>
///
private string GetCode(int codeLength)
{
Random rand = new Random();
string so = "1,2,3,4,5,6,7,8,9,0";
string[] strArr = so.Split(',');
string code = "";
for (int i = ; i < codeLength; i++)
{
code += strArr[rand.Next(, strArr.Length)];
}
return code;
} private string GetCodeForIdNo()
{
byte[] bytes = new byte[];
System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
rng.GetBytes(bytes);
int j = Math.Abs(BitConverter.ToInt32(bytes, ));
if (j.ToString().Length == )
{
return GetCode() + j.ToString();
}
else if (j.ToString().Length == )
{
return GetCode() + j.ToString();
}
else if (j.ToString().Length == )
{
return GetCode() + j.ToString();
}
else if (j.ToString().Length == )
{
return j.ToString();
}
else
{
return j.ToString().Substring(,);
}
} public List<IdCard> CreateIdCard()
{
string CardFrist = "";//北京市市区
List<IdCard> CMlist = new List<IdCard>();
int Year = ;
List<int> YearList = new List<int>();//年份范围
List<int> monthList = new List<int>();//月份范围
List<int> dayList = new List<int>();//天范围
for (int i = -; i < ; i++)
{
YearList.Add(Year + i);
} for (int i = ; i < ; i++)
{
monthList.Add(i);
}
//不考虑瑞年非闰年及月份的天数 最大28天
for (int i =; i < ; i++)
{
dayList.Add(i);
}
//dd
XiCard(YearList); XiCard(monthList); XiCard(dayList);
for (int i = ; i < ; i++)
{
IdCard CM = new IdCard();
int Y_Len=YearList.Count;
int M_Len=monthList.Count;
int D_Len=dayList.Count;
int Nyear = YearList[i % Y_Len];
int Nmonth = monthList[i % M_Len];
int Nday = dayList[i % D_Len];
if (Nmonth < &&Nday<)
{
CM.BrithDay = Convert.ToDateTime(Nyear.ToString() + "-0" + Nmonth.ToString() + "-0" + Nday.ToString());
CM.IdNo = CardFrist + CM.BrithDay.ToString("yyyyMMdd") + GetCodeForIdNo();
CMlist.Add(CM);
}
if (Nmonth < && Nday > )
{
CM.BrithDay = Convert.ToDateTime(Nyear.ToString() + "-0" + Nmonth.ToString() + "-" + Nday.ToString());
CM.IdNo = CardFrist + CM.BrithDay.ToString("yyyyMMdd") + GetCodeForIdNo();
CMlist.Add(CM);
}
if (Nmonth > && Nday > )
{
CM.BrithDay = Convert.ToDateTime(Nyear.ToString() + "-" + Nmonth.ToString() + "-" + Nday.ToString());
CM.IdNo = CardFrist + CM.BrithDay.ToString("yyyyMMdd") + GetCodeForIdNo();
CMlist.Add(CM);
}
if (Nmonth > && Nday < )
{
CM.BrithDay = Convert.ToDateTime(Nyear.ToString() + "-" + Nmonth.ToString() + "-0" + Nday.ToString());
CM.IdNo = CardFrist + CM.BrithDay.ToString("yyyyMMdd") + GetCodeForIdNo();
CMlist.Add(CM);
} }
return CMlist;
} /// <summary>
/// dd
/// </summary>
/// <param name="list"></param>
private void XiCard(List<int> list)
{
int i = list.Count;
int j;
if (i == )
{
return;
}
while (--i != )
{
Random ran = new Random();
j = ran.Next() % (i + );
int tmp = list[i];
list[i] = list[j];
list[j] = tmp;
}
}
#endregion
Model 很简单,如下:
public class IdCard
{
public string IdNo { get; set; }
public DateTime BrithDay { get; set; }
}
测试如下:
@陈卧龙的博客
Random快速产生相同随机数的原因及解决方案的更多相关文章
- python random模块(获取随机数)的常用方法及示例
random.randomrandom.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0 random.uniformrandom.uniform(a, b),用 ...
- 玩转Windows服务系列——无COM接口Windows服务启动失败原因及解决方案
将VS创建的Windows服务项目编译生成的程序,通过命令行 “服务.exe -Service”注册为Windows服务后,就可以通过服务管理器进行管理了. 问题 通过服务管理器进行启动的时候,发现服 ...
- iOS构建流畅的交互界面--CPU,GPU资源消耗的原因和解决方案
CPU资源消耗的原因和解决方案对象创建轻量对象代替重量对象* 不需要响应触摸事件的控件:CALayer显示* 对象不涉及UI操作,则尽量放到后台线程创建* 包含有CALayer的控件只能在主线程创建和 ...
- CRL快速开发框架系列教程六(分布式缓存解决方案)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- PowerDesigner16.5 连64位MySQL,出错:SQLSTATE = IM014。原因及解决方案
- NIOS II CPU复位异常的原因及解决方案
NIOS II CPU复位异常的原因及解决方案 近期在用nios ii做项目时,发现一个奇怪的现象,在NIOS II EDS软件中编写好的代码,烧写到芯片中,第一次能够正常运行,但是当我按下板卡上 ...
- oracle超出打开游标的最大数的原因和解决方案
oracle超出打开游标的最大数的原因和解决方案 分类: Oracle相关2012-06-05 10:36 6362人阅读 评论(0) 收藏 举报 oracle数据库sqljavasessionsys ...
- Selenium+PhantomJS使用时报错原因及解决方案(转)
Selenium+PhantomJS使用时报错原因及解决方案 问题 今天在使用selenium+PhantomJS动态抓取网页时,出现如下报错信息: UserWarning: Selenium ...
- Atitit it行业图像处理行业软件行业感到到迷茫的三大原因和解决方案
Atitit it行业图像处理行业软件行业感到到迷茫的三大原因和解决方案 1. 迷茫的原因最大原因是未知1 1.1. 我在哪里??自己的定位,1 1.2. 正确方向是什么??1 1.3. 虽然找到方向 ...
随机推荐
- android recovery 升级UI显示之资源文件
Recovery只有在升级的时候才会呈现给用户,所以界面一般都很简单,没有android上层那么绚丽,所以recovery下面对图片的支持很有限,仅支持png图片显示,所以我们可以看到,recover ...
- python第二天 列表、元组
今天学习了列表.元组相关的知识:与C中的数组列表相似,元组为只读列表: 以及切片相关操作: #!usr/bin/env python #-*-coding:utf-8-*- # Author calm ...
- 移动端上拉加载,下拉刷新效果Demo
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- OpenCV 的颜色空间转换
# coding: utf-8 ''' 第13章主要介绍:颜色空间转换 ''' import cv2 import numpy as np ''' 经常用到的颜色空间转换是: BGR<-> ...
- VMWare:vSphere6 企业版参考序列号
HV4WC-01087-1ZJ48-031XP-9A843 NF0F3-402E3-MZR80-083QP-3CKM2 4F6FX-2W197-8ZKZ9-Y31ZM-1C3LZ JZ2E9-6D2D ...
- <20190104>关掉一些鸡肋的Win10功能
讨厌鬼001 # - windows defender - 本身没什么卵用, 却一直占着位置, 而且不断提示更新. 必须关闭它 . 在"运行" 中, 输入 "gp ...
- VS code 修改主题设置代码对其齐线
用VS Code 写代码的时候有时候缩进太多就不知道对应的是哪一个标签了,那么可不可以让它显示缩进参考线,这样就清楚的多了.答案是肯定的,方法如下: 找到 文件-->首选项——>设置→搜索 ...
- POI生成Web版Word文件
POI生成Web版Word文件 1 通过URL的输入流实现 2 直接把Html文本写入到Word文件 所谓的使用POI生成Web版Word文件是指利用POI将Html代码插入到 ...
- Ajax进阶之原生js与跨域jsonp
什么是Ajax? 两个数求和: 用Jquery和数据用json格式 viws函数: from django.shortcuts import render,HttpResponse # Create ...
- python五十七课——正则表达式(边界字符)
演示匹配锚字符(边界字符)^:从字符串头部开始匹配,在开启多行模式下(re.M),可以尝试匹配每一行的头部数据$:从字符串尾部开始匹配,在开启多行模式下(re.M),可以尝试匹配每一行的尾部数据A:从 ...