关于Random类的使用说明

本文详细介绍了在编程中如何使用Random类生成随机数,包括构造方法的选择、Next方法的不同用法及示例,确保生成的随机数具有足够的随机性。

a. 构造方法2个

第一种方法不指定随机种子,系统自动选取当前时前作随机种子:
Random ra=new Random();

第二种方法是指定一个int型的参数作为随机种子:

int iSeed=6;
Random ra=new Random(iSeed);

 

常用的是: Random ra=new Random(unchecked((int)DateTime.Now.Ticks));

 

其中随机数是这样创建的 Random ra=new Random(unchecked((int)DateTime.Now.Ticks));为什么不用Random ra=new Random();(系统自动选取当前时前作随机种子)呢?

用 系统时间做随机种子并不保险,如果应用程序在一个较快的计算机上运行,则该计算机的系统时钟可能没有时间在此构造函数的调用之间进行更改,Random 的不同实例的种子值可能相同。这种情况下,我们就需要另外的算法来保证产生的数字的随机性。所以为了保证产生的随机数足够"随机",我们不得不使用复杂一 点的方法来获得随机种子。在上面的这段程序中,我们首先使用系统时间作为随机种子,然后将上一次产生的随机数跟循环变量和一个与系统时间有关的整型参数相 乘,以之作为随机种子,从而得到了每次都不同的随机种子,保证了产生足够"随机"的随机数。

 

b. Next方法  三个重载的方法

 

(1)ra.Next();

它返回一个大于或等于零而小于2,147,483,647的数,这并不满足我们的需要,下面我们介绍它的重载函数和其它一些方法。

(2)public virtual int Next(int);

用法:ra.next(20)  取不到最大值

返回一个小于所指定最大值(此处为20)的正随机数。

(3)public virtual int Next(int minValue, int maxValue);

用法:ra.next(1,20)   取不到最大值

返回一个指定范围内(此处为1-20之间)的随机数

 

c. 公共方法:

NextBytes用随机数填充指定字节数组的元素。  参数为一个bytes数组。传入即可  byte是8位的无符号数,0-255的区间,sbyte是有符号的byte类型,-128---127的区间

NextDouble返回一个介于 0.0 和 1.0 之间的随机数。

受保护的方法:

Sample返回一个介于 0.0 和 1.0 之间的随机数,只允许子类对象访问。

用来被子类覆盖重写

如:

public
 class
 RandomProportional : Random
{
// The Sample method generates a distribution proportional to the value
// of the random numbers, in the range [0.0, 1.0].
protected override double Sample( )
{
return Math.Sqrt( base .Sample( ) );
}

public override int Next()
{
return (int ) (Sample() * int .MaxValue);
}
}

 

 

d.一个示例来演示,如何生成6个不同的介于【1,20)的随机数

 

using System;
using System.Collections.Generic;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(String[] args)
        {

            print(getRandomNum(19, 1, 20));


        }

        public static List<int> getRandomNum(int num,int minValue,int maxValue)
        {
            List<int> al = new List<int>();
            Random rnd = new Random(unchecked((int)DateTime.Now.Ticks));
            for (int i = 0; i < num; i++)
            {
                bool isRepeat = true;
                int value;
                while (isRepeat)
                {
                    value = rnd.Next(minValue, maxValue);
                    if (!al.Contains(value))
                    {
                        isRepeat = false;                       
                        al.Add(value);
                    }
                }
               
            }
            return al;
        }

        public static void print(List<int> list)
        {
            for (int i = 0; i < list.Count; i++)
            {
                Console.WriteLine(list[i]+" ");
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值