2010-06-26 3 views
0

Когда я прочитал какой-то вопрос о создании случайного генератора нубера, я увидел эту функцию, и она эффективна, но написана на C#. Я хочу видеть эту функцию в форме 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; 
    } 
} 
+1

Это C#, а не C++. –

+0

извините, моя вина. – 2010-06-26 11:35:45

+0

Это не C ... – Dacav

ответ

2

Вопросы, касающиеся генераторов чисел для C, задавались здесь, на SO, например, в статье «Create Random Number Sequence with No Repeats».

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

1

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

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

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

+0

Мне нужно, потому что я должен использовать эффективный генератор случайных чисел. – 2010-06-26 11:39:04

+0

@gcc: Вы знаете, что сохранение уникальности делает этот подход менее эффективным, чем просто использование 'rand', когда вам действительно не нужна уникальность, не так ли? – sepp2k

+1

хорошо, что генератор довольно неэффективен для случая, когда количество близко к дальности. В таком случае перетасовка будет намного лучше. –

0

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

0

Чтобы написать совместную процедуру на 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) чтобы intialise новой последовательности, и (0, 0) продолжить предыдущую последовательность.

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

+0

В любой стандартной библиотеке C, о которой я знаю, нет функции Random(). В стандарте ISO C заданы функции rand() и связанные функции, а BSD имеет random() [not Random()], который поддерживается, я считаю, компилятором GNU C по соображениям совместимости. –

+0

@Joel Hoff: Да, пользователь должен был бы реализовать функции 'Random()' и 'used_add()', я обращался только к тому, как переопределить структуру подпрограмм в C. – caf

Смежные вопросы