随机数生成器 - 可变长度

本文关键字:随机数生成器 | 更新日期: 2023-09-27 18:18:38

目前我的程序会随机生成由数字组成的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 次。

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

随机数生成器 - 可变长度

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

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()));
    }
}

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

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

也许效率不高,但看起来很酷:D

如果你想预先

找到代码的长度,请使用:

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;
    }

我会这样做:

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

希望你明白:)

这个实际上可能很有效

    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 个字符。