алгоритм для генерации случайной числовой строки длиной 10 000 символов? - PullRequest
1 голос
/ 19 ноября 2010

Может быть на любом языке или даже псевдокоде.Меня спросили об этом в интервью, и мне было любопытно, что вы, ребята, можете придумать.

Ответы [ 8 ]

3 голосов
/ 20 ноября 2010

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

Еслиалгоритмический генератор случайных чисел поддерживает n битов состояния, тогда он, очевидно, может генерировать не более 2 n возможных различных выходных последовательностей, поскольку существует только 2 n различные начальные конфигурации.

2 33219 <10 <sup>10000 <2 <sup>33220 , поэтому, если ваш алгоритм использует менее 33220биты внутреннего состояния, не может генерировать некоторые из 10 10000 возможных 10000-значных (десятичных) чисел.

Типичные генераторы случайных чисел стандартной библиотеки не будутиспользуйте что-нибудь подобное этому внутреннему состоянию.Даже Mersenne Twister (наиболее часто упоминаемый генератор с большим состоянием, о котором я знаю) сохраняет только 624 32-битных слова (= 19968 бит) в состоянии.

1 голос
/ 19 ноября 2010

Без дополнительных требований это будет работать:

StringBuilder randomStr = new StringBuilder(10000);
Random rnd = new Random();
for(int i = 0; i<10000;i++)
{
  char randomChar = rnd.AsChar();
  randomStr[i] = randomChar;
}

Это приведет к непечатным символам и другим неприятностям.Используя кодировщик ASCII, вы можете получать буквы, цифры и знаки препинания, придерживаясь диапазона от 32 до 126. Или создавая случайное число от 0 до 94 и добавляя 32. Не уверены, какой аспект они искали в вопросе.1005 * Кстати, нет, я не знал видимого диапазона от макушки головы, я посмотрел его в википедии.

1 голос
/ 19 ноября 2010

Просто один из многих способов.Вы можете передать любую строку алфавита символов, которые хотите использовать:

public class RandomUtils
{
    private static readonly Random random = new Random((int)DateTime.Now.Ticks);

    public static string GenerateRandomDigitString(int length)
    {
        const string digits = "1234567890";

        return GenerateRandomString(length, digits);
    }

    public static string GenerateRandomAlphaString(int length)
    {
        const string alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

        return GenerateRandomString(length, alpha);
    }


    public static string GenerateRandomString(int length, string alphabet)
    {
        int maxlen = alphabet.Length;

        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < length; i++)
        {
            sb.Append(alphabet[random.Next(0, maxlen)]);
        }

        return sb.ToString();
    }
}
0 голосов
/ 19 ноября 2010

Я думаю, что реальный вопрос состоял в том, чтобы определить, что на самом деле хотел интервьюер. Например, случайный в каком смысле? Uncompressable? Случайно по нескольким прогонам одного и того же алгоритма? И т.д.

0 голосов
/ 19 ноября 2010

Вы можете начать со списка начальных цифр:

seeds = [4,9,3,1,2,5,5,4,4,8,4,3] # This should be relatively large

Затем используйте счетчик, чтобы отслеживать, какая цифра использовалась в последний раз. Это будет общесистемное и не должно сбрасываться с системой:

def next_digit():
    counter = 0
    while True:
        yield counter
        counter += 1
pos_it = next_digit()
rand_it = next_digit()

Далее, используйте алгоритм, который использует модуль для определения «следующего числа»:

def random_digit():
    position = pos_it.next() % len(seeds)
    digit = seeds[position] * rand_it.next()
    return digit % 10

Последнее, сгенерируйте 10000 из этих цифр.

output = ""
for i in range(10000):
    output = "%s%s" % (output, random_digit())

Я считаю, что в идеальном ответе было бы больше простых чисел, но этого должно быть достаточно.

0 голосов
/ 19 ноября 2010

Возвращает строку, содержащую 10 000 1 с - это так же случайно, как и любая другая строка цифр такой же длины.

0 голосов
/ 19 ноября 2010

Мне всегда нравится говорить, что компьютерные случайные числа всегда только псевдослучайные. В любом случае, ваш любимый язык всегда будет иметь случайную библиотеку. Далее, что такое числовая строка? 0-9 ценится за каждого персонажа? Что ж, давайте начнем с этого предположения. Таким образом, мы можем генерировать байты между кодами Ascii 0-9 со смещением (48) и (int) random * 10 (поскольку случайные генераторы обычно возвращают числа с плавающей запятой). Затем поместите все это в буфер символов длиной 10000 и преобразуйте в строку.

0 голосов
/ 19 ноября 2010

Генерирует число в диапазоне 0..9. Преобразуйте это в цифру. Наполните это в строку. Повторите 10000 раз.

...