生成一批随机密码

时间:2010-09-28 15:47:39

标签: c# passwords random

生成随机密码很简单。但是生成批次更加困难。

    public static string getRandomPassword(int letters, int getallen) {
        //int letters = 8;
        //int getallen = 5;

        char[] letterdeel = new char[letters];
        int minGetal = (int)Math.Pow(10, getallen - 1);
        int maxGetal = (int)Math.Pow(10, getallen);

        string password;
        Random r = new Random();
        int test = (int)(DateTime.Now.Ticks);
        for (int i = 0; i < letters; i++) {
            r = new Random((int)(DateTime.Now.Ticks) + i);
            bool capital = r.Next(2) == 0 ? true : false;
            if (capital) {
                letterdeel[i] = (char)r.Next(65, 91);
            } else {
                letterdeel[i] = (char)r.Next(97, 123);
            }
        }

        password = new string(letterdeel);
        password += r.Next(minGetal, maxGetal);

        return password;
    }

这是我的方法,密码应该是某种字母数字格式。 这工作正常,但如果我有一个for循环从这个方法中提取100个密码,在我的数组中我有5-8个相同的密码,然后再次5-8相同的密码。

我知道为什么会这样,因为它依赖于随机功能和时钟,但我该如何解决这个问题?

3 个答案:

答案 0 :(得分:5)

如果您反复调用它,请将Random r移到方法外部。您将在相同的相对时间范围内多次击中它,因此您将生成相同的种子。你也想摆脱下面的界限。这是不必要的,并且(再次)with the nature of DateTime.Now,您将继续生成相同的“随机”数字序列。

r = new Random((int)(DateTime.Now.Ticks) + i); 

答案 1 :(得分:2)

将随机数生成器定义为函数外部的静态。

How can I get true randomness in this class without Thread.Sleep(300)?

答案 2 :(得分:0)

使用集合而不是您存储的任何集合,并且不循环100次,但直到集合中有100个项目。