zoukankan      html  css  js  c++  java
  • .Net 生成不重复的随机数

    int myran = 10;//初始化myran 
    public static int GenForInt(int minvalue, int maxvalue,ref int myran)  //自动生成int型的随机数据 

        Random ran 
    = new Random();
        
    int RandKey; 
        
    do 
        { 
             RandKey 
    = ran.Next(minvalue, maxvalue); 
        }
    while (RandKey == myran); 
        Console.WriteLine(
    "RandKey:" + RandKey); 
        myran 
    = RandKey; //将本次的随机值赋给myran 
        return RandKey; 
    }




    先来说说随机数算法的实现.借用C数值算法里的一句话:利用计算机,这种人类所设计的
    各种机器中最精确,最能做出确切判断的机器,来产生"随机数",这看上去有些自相矛盾.甚至在
    概念上是讲不通的.任何程序必将产生完全可以预计的结果.因而不是真正的"随机数".

    现在各种语言中的随机数产生函数所产生的"随机数",实际上被称之为"伪随机数".可以将
    整个随机数函数看做这样一个表达式:

    A = R(s)

    其中R是随机函数,s是种子.A是一个数列.即对于任意一个种子s,经过R的计算后,总有一个确定
    的数列A与之对应.而当在C#里调用var rnd = new Random (s)或在C里调用srand(s)实质上
    所做工作之一就是设定这个种子.而rnd.Next();或rand()只不过是在A上取下一个元素而已.当然实
    际的实现不可能事先计算一个数列A,所以rand()相当于由s计算出下一个数字s',然后将s'作为新
    的种子赋值给s,最后将s'作为结果返回.


    **-------------------------
    接下来就是两种常见的错误用法了:

    for (int i=0;i<n;++i)
    {
        var rnd 
    = new Random (s);//s是实先确定的一个数字
        Console.Write ("{0},",rnd.Next());
    }


    这样使用随机数产生器只会产生一个固定的常数N.
    因为每次都用同一个种子初始化了随机数产生器后调用了Next().
    所取得的都是数列A上的第一个元素.而这个元素的值肯定是固定
    的(当然N取什么值要看随机函数的实现而定).

    而第二种情况就更常见了:

    for (int i=0;i<n;++i)
    {
        var rnd 
    = new Random ();//用系统时间作为种子
        Console.Write ("{0},",rnd.Next());
    }

    这样调用应该是希望通过时间的不同来达到随机的效果;但是得到的结果就和我那位朋友一样.会是形似
    97,97,97,97,....97,30,30,30,30,30,30,30,30,30,30,30,30,....,27,27,27,27,27,27,....
    的一串数列.这是因为Windows系统时钟的更新频率大概在10ms左右.而这个for循环的执行显然要快
    得多.于是在一段执行时间内Environment.TickCount (Random的默认种子)或是C的time函数返回的
    都是同一个值.从而导致rnd.Next在一段时间内返回一个常数.


    ps:在一个经常用到随机数的程序中,可初始化一个全局的随机数产生器,在
    之后要用到随机数的地方就直接调用Next,而不用每次都构造一个Random.
  • 相关阅读:
    Android studio初次安装启动时弹出unable to access android sdk add-on list提示的解决方法
    SQL Server(MSSQLSERVER) 请求失败或服务未及时响应,有关详细信息,请参见事件日志或其他的适用的错误日志。
    Docker启动时提示Get Permission Denied while trying to connect解决方法
    Docker版本与centos和ubuntu环境下docker安装介绍
    菜鸟宝典之Windows Server 2012 R2上PHP、MySQL环境搭建
    Java入门指南-04 顺序、分支、循环
    Java入门指南-03 操作符与表达式
    Java入门指南-02 变量
    Java入门指南-01 基本概要说明
    JavaWeb零基础入门-02 开发环境安装
  • 原文地址:https://www.cnblogs.com/Fooo/p/1364094.html
Copyright © 2011-2022 走看看