c#生成随机数

一、Random类

表示伪随机数生成器,一种能够产生满足某些随机性统计要求的数字序列的设备。
Random.Next()有3个重载。
/// 
/// 生成随机数
/// 
/// 
public List RDNumber()
{
    List col = new List();
    for (int i = 0; i < 6; i++)
    {
        Random rd = new Random();//使用种子值初始化 System.Random 类的新实例。默认使用与时间相关的默认种子值
        var a = rd.Next();//大于等于零且小于 System.Int32.MaxValue 的 32 位带符号整数。
        //var a = rd.Next(1, 10);//Next(int minValue, int maxValue);(生成1~10之间的随机数,不包括10)
        col.Add(a);
    }
    return col;
}
由于System.Random 类默认的无参构造函数使用与时间相关的默认种子值。上面例子循环完成的时间很短,所以根据系统时间得到的随机数是一样的。
c#生成随机数_第1张图片
这时把初始化Random类放在循环外面试一下:
public List RDNumber()
{
    List col = new List();
    Random rd = new Random(1);//使用种子值初始化 System.Random 类的新实例。默认使用与时间相关的默认种子值
    for (int i = 0; i < 6; i++)
    {
        var a = rd.Next(1,10);//Next(int minValue, int maxValue);(生成1~10之间的随机数,不包括10)
        col.Add(a);
    }
    return col;
}

结果:没有出现重复值

c#生成随机数_第2张图片

1、生成不重复随机数

方法一:

/// 
/// 指定范围内的不重复随机数(要求随机数个数小于随机数范围否则程序会陷入死循环。可在循环中加入跳出机制)
/// 
/// 随机数个数
/// 随机数下限
/// 随机数上限
/// 
public List GetRandomArray(int Number, int minNum, int maxNum)
{
    int j;
    List b = new List();
    Random r = new Random();
    for (j = 0; j < Number; j++)
    {
        int i = r.Next(minNum, maxNum + 1);
        if (b.Contains(i))  //是否包含这个数
        {
            j = j - 1;
        }
        else 
        { 
            b.Add(i); 
        }
    }
    return b;
}

方法二:思想是用一个数组来保存索引号,先随机生成一个数组位置,然后把随机抽取到的位置的索引号取出来,并把最后一个索引号复制到当前的数组位置,然后使随机数的上限减一,具体如:先把这100个数放在一个数组内,每次随机取一个位置(第一次是1-100,第二次是1-99,...),将该位置的数用最后的数代替。

    int[] index = new int[15];
    for (int i = 0; i < 15; i++)
        index[i] = i;
    Random r = new Random();
    //用来保存随机生成的不重复的10个数 
    int[] result = new int[10];
    int site = 15;//设置上限 
    int id;
    for (int j = 0; j < 10; j++)
    {
        id = r.Next(1, site - 1);
        //在随机位置取出一个数,保存到结果数组 
        result[j] = index[id];
        //最后一个数复制到当前位置 
        index[id] = index[site - 1];
        //位置的上限减少一 
        site--;
    }

2、生成字母数字随机组合

  这里先说一下说一下ASCII:ASCII(American Standard Code for Information Interchange, 美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要 用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码 系统,并等同于国际标准ISO/IEC 646。

A-Z的 ASCII值为65-90,a-z的 ASCII值为97-122

代码:

/// 
/// 生成单个随机数字
/// 
public int createNum(Random random)
{
    int num = random.Next(10);
    return num;
}
/// 
/// 生成单个大写随机字母
/// 
public string createBigAbc(Random random)
{
    //A-Z的 ASCII值为65-90
    int num = random.Next(65, 91);
    string abc = Convert.ToChar(num).ToString();
    return abc;
}
/// 
/// 生成单个小写随机字母
/// 
public string createSmallAbc(Random random)
{
    //a-z的 ASCII值为97-122
    int num = random.Next(97, 123);
    string abc = Convert.ToChar(num).ToString();
    return abc;
}
/// 
/// 生成随机字母数字组合
/// 
/// 
public string GetRandom()
{
    Random random = new Random();
    //创建一个StringBuilder对象存储密码
    StringBuilder sb = new StringBuilder();
    //使用for循环把单个字符填充进StringBuilder对象里面变成14位密码字符串
    for (int i = 0; i < 14; i++)
    {
        //随机选择里面其中的一种字符生成
        switch (random.Next(3))
        {
            case 0:
                //调用生成生成随机数字的方法
                sb.Append(createNum(random));
                break;
            case 1:
                //调用生成生成随机小写字母的方法
                sb.Append(createSmallAbc(random));
                break;
            case 2:
                //调用生成生成随机大写字母的方法
                sb.Append(createBigAbc(random));
                break;
        }
    }
    return sb.ToString();
}



你可能感兴趣的:(C#)