• .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.
  • 相关阅读:
    Linux Shell常用shell命令
    shell ls
    [转]推荐一些不错的计算机书籍
    What does it mean when you assign [super init] to self?
    保存,读取与多任务处理
    程序媛去过的地方
    读取pcap文件,过滤非tcp包,获取IP及tcp端口信息
    IM实现联系人及联系人分组的数据库设计
    【原创】校园网用户,1个账号2个笔记本上网,Ad hoc无线连网应用
    【openfire插件开发】群组聊天中的中介者模式
  • 原文地址:https://www.cnblogs.com/Fooo/p/1364094.html
Copyright © 2020-2023  润新知