随机数发生器 - 可变长度

时间:2011-12-23 17:10:16

标签: c# random numbers

目前我的程序会生成由数字组成的随机8个字符串。

见下文

public static string GenerateNewCode()
    {
        string newCode = String.Empty;
        int seed = unchecked(DateTime.Now.Ticks.GetHashCode());
        Random random = new Random(seed);

        // keep going until we find a unique code       
        do
        {
            newCode = random.Next(0, 9999).ToString("0000")
                    + random.Next(0, 9999).ToString("0000");
        }
        while (!ConsumerCode.isUnique(newCode));

        // return
        return newCode;
    }

但是,我希望能够创建8,9,10,11和12个数字的随机码。

不确定最有效的方法。

我的想法是在0到9之间创建一个随机数,然后根据所需的代码长度执行X次。

必须有一种简单/更有效的方法来做到这一点......

6 个答案:

答案 0 :(得分:2)

除非这是时间关键,否则我每次只生成一个12位数的随机数,只需使用我需要的8-12位数。您正在测试并重试唯一性,因此仍然有效。

答案 1 :(得分:1)

internal class Program {
    private static void Main(string[] args) {
        Console.WriteLine(GetNumber(7));
        Console.WriteLine(GetNumber(8));
        Console.WriteLine(GetNumber(12));
        Console.WriteLine(GetNumber(500));
    }

    public static string GetNumber(int length) {
        return string.Concat(RandomDigits().Take(length));
    }

    public static IEnumerable<int> RandomDigits() {
        var rng = new Random(System.Environment.TickCount);
        while (true) yield return rng.Next(10);
    }
}

internal class Program {
    private static void Main(string[] args) {
        Console.WriteLine(GetNumber(12));
    }

    public static string GetNumber(int length) {
        var rng = new Random(Environment.TickCount);
        return string.Concat(Enumerable.Range(0, length).Select((index) => rng.Next(10).ToString()));
    }
}

容易吗?是。效率最高?也许不是。

答案 2 :(得分:0)

我会这样做:

List<int> li = new List<int>();
for(int i = 0; i<=9999; i++) 
{
li.Add(i);
}
List<int> liRandom = new List<int>();
for(int i = 0; i<= 9999; i++) //replace 9999 with a number you need to gen
{
int randomIndex = rand.Next(0,li.Length);
liRandom.Add(li[randomIndex]);
li.Remove(li[randomIndex]);
}// liRandom now contains needed numbers

希望你有这个想法:)

答案 3 :(得分:0)

 var r = new Random();
 z = 12
 Enumerable.Range(1,z).Select(x => r.Next(10).ToString()).Aggregate((x,y) => x + y)

可能效率不高但看起来很酷:D

答案 4 :(得分:0)

如果要预定义代码的长度,请使用:

public static string GenerateNewCode(int length)
    {
        string newCode = String.Empty;
        int seed = unchecked(DateTime.Now.Ticks.GetHashCode());
        Random random = new Random(seed);

        // keep going until we find a unique code       
        do
        {
            newCode = random.Next(Math.Pow(10,length-1), Math.Pow(10,length)-1).ToString("0000")
        }
        while (!ConsumerCode.isUnique(newCode));

        // return
        return newCode;
    }

如果您希望长度是随机的,请使用:

public static string GenerateNewCode()
    {
        string newCode = String.Empty;
        int seed = unchecked(DateTime.Now.Ticks.GetHashCode());
        Random random = new Random(seed);
        int length = random.Next(9,12);
        // keep going until we find a unique code       
        do
        {
            newCode = random.Next(Math.Pow(10,length-1), Math.Pow(10,length)-1).ToString("0000")
        }
        while (!ConsumerCode.isUnique(newCode));

        // return
        return newCode;
    }

答案 5 :(得分:0)

这个实际上可能是高效的

    public static string GetNumber(int length) {
        var rng = new Random(Environment.TickCount);
        var number = rng.NextDouble().ToString("0.000000000000").Substring(2, length);
        return number;
    }

最多可以使用12个字符,最多可以使用16个字符。