мы можем написать эту функцию в форме c - PullRequest
0 голосов
/ 26 июня 2010

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

IEnumerable<int> ForLargeQuantityAndRange(int quantity, int range)
{
    for (int n = 0; n < quantity; n++)
    {
        int r = Random(range);

        while (!used.Add(r))
            r = Random(range);

        yield return r;
    }
}

Ответы [ 4 ]

2 голосов
/ 26 июня 2010

Вопросы, касающиеся генераторов чисел для C, уже задавались здесь, на SO, например, в статье " Создание последовательности случайных чисел без повторов ".

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

1 голос
/ 26 июня 2010

Это не совсем функция, как функция в C или C ++. Это подпрограмма, которую можно возобновить.

Чтобы реализовать его в C, вам нужно будет поддерживать внешнее состояние и предоставлять функцию «следующего значения».

Преимущество этой функции в том, что она гарантирует уникальные значения. Вам это действительно нужно? Если нет, используйте ранд stdlib, умноженный на соответствующие коэффициенты.

0 голосов
/ 26 июня 2010

Чтобы написать подпрограмму на C, вам нужно поддерживать состояние. Самый простой способ сделать это - использовать переменную static. Для этого примера это будет выглядеть примерно так:

int ForLargeQuantityAndRange(int init_quantity, int init_range)
{
    static int n;
    static int quantity, range;

    if (init_quantity > 0)
    {
        n = 0;
        quantity = init_quantity;
        range = init_range;
    }

    if (n++ < quantity)
    {
        int r = Random(range);

        while (!used_add(r))
            r = Random(range);

        return r;
    }

    /* Quantity exceeded */
    return -1;
}

... где вы бы назвали его с помощью (quantity, range) для инициализации новой последовательности и (0, 0) для продолжения предыдущей последовательности.

Обратите внимание, что вам нужно будет предоставить реализации функций Random() и used_add().

0 голосов
/ 26 июня 2010

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

...