Генератор случайных чисел - переменная длина - PullRequest
1 голос
/ 23 декабря 2011

В настоящее время моя программа генерирует случайные 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 ]

2 голосов
/ 23 декабря 2011

Если это не критично ко времени, я просто каждый раз генерирую 12-значное случайное число и просто использую 8-12 нужных мне цифрВы тестируете и повторяете уникальность, так что это все равно должно работать.

1 голос
/ 23 декабря 2011
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()));
    }
}

Легко? да. Наиболее эффективным? возможно нет.

0 голосов
/ 23 декабря 2011

и этот может быть эффективным

    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.

0 голосов
/ 23 декабря 2011

Если вы хотите, чтобы длина кода была предопределена, используйте:

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;
    }
0 голосов
/ 23 декабря 2011
 var r = new Random();
 z = 12
 Enumerable.Range(1,z).Select(x => r.Next(10).ToString()).Aggregate((x,y) => x + y)

возможно, не так эффективно, но выглядит круто: D

0 голосов
/ 23 декабря 2011

Я бы сделал это так:

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

Надеюсь, у вас есть идея:)

...