zoukankan      html  css  js  c++  java
  • 产生一组少重复的随机数

    最近在开发项目的过程中,需要产生一些随机数,如果我们简单的用C#中的Random.Next方法,很难产生一组少重复的随机数(当然是伪随机数),在网上也看了很多方法,貌似也不可行,或者比较复杂。于是,参考网上的一些方法,自己写了两个个产生一组伪随机数的方法。

    方法一的代码如下:

    [c-sharp] view plaincopy
    1. List<int> GenerateRandom(int iMax, int iNum)  
    2. {  
    3.     List<int> lstRet = new List<int>();  
    4.     for (int i = 0; i < iNum; i++)  
    5.     {  
    6.         long lTick = DateTime.Now.Ticks;  
    7.         Random ran = new Random((int)lTick * i);  
    8.         int iTmp = ran.Next(iMax);  
    9.         lstRet.Add(iTmp);  
    10.     }  
    11.     return lstRet;  
    12. }  

    其中,iMax表示最大范围,iNum是产生的随机数个数。

    利用这种方法,得到了一组范围(0...iMax)之间的伪随机数,很少有重复的数据,这种方法得到的是一个有某种规律的随机数序列。

    分析其中的原因,其实是因为每次植入的种子不一样,主要是因为 i 的变化,在.Net平台,ticks数在一段时间内其实是一个定值,因此,虽然这种方法得到了一组随机数,但是可能得到的数据之间有某种规律。

    方法二的代码如下:

    [c-sharp] view plaincopy
    1. List<int> GenerateRandom(int iMax, int iNum)  
    2. {  
    3.     long lTick = DateTime.Now.Ticks;  
    4.     List<int> lstRet = new List<int>();  
    5.     for (int i = 0; i < iNum; i++)  
    6.     {  
    7.         Random ran = new Random((int)lTick * i);  
    8.         int iTmp = ran.Next(iMax);  
    9.         lstRet.Add(iTmp);  
    10.         lTick += (new Random((int)lTick).Next(978))  
    11.     }  
    12.     return lstRet;  
    13. }  

    第二种方法也变换了种子,倒数第三行的Next方法中可以输入任意大小的参数。这种方法得到的随机数相比方法一要更好一些。

  • 相关阅读:
    mysql启动失败
    mini.open参数传递
    json的key动态赋值
    Python文件格式 .py .pyc .pyw .pyo .pyd的主要区别
    centos 7.2 安装mongodb 3.4.4免编译
    tomcat 8.0安装ssl证书,及centos7.2 的openssl升级到最新版本,及ERR_SSL_OBSOLETE_CIPHER错误解决
    云服务器 Centos7.0 部署
    笔记
    oracle 视图的创建,游标,left join
    在Extjs中对日期的处理,以及在后端数据在SQL语句的判断处理
  • 原文地址:https://www.cnblogs.com/dandandeyoushangnan/p/4589858.html
Copyright © 2011-2022 走看看