2009-11-04 2 views
5

Я хочу генерировать случайные числа от -n до n, исключая 0. Может ли кто-нибудь предоставить мне код в C? Как исключить 0?Создание случайных чисел от -n до n в C

+1

Почему голос? Я хочу, чтобы этот сайт заставил людей добавлять комментарий, когда они голосуют. –

ответ

9

Одной из идей может быть создание случайного числа x в диапазоне [1,2n] включительно. Затем верните -(x - n) для x больше, чем n, иначе просто верните x.

Это должно работать:

int my_random(int n) 
{ 
    const int x = 1 + rand()/(RAND_MAX/(2 * n) + 1); 

    return x > n ? -(x - n) : x; 
} 

Смотрите comp.lang.c FAQ для получения дополнительной информации о том, как использовать rand() безопасно; это объясняет вышеупомянутое использование.

+0

Спасибо. Крис только что отправил ответ до того, как я сделал это. – avd

3

Самое простое, что я могу предложить, чтобы сделать это, чтобы сгенерировать случайное число от 0 до 2л, а затем сделать математику трюк:

result= n - randomNumber 

Хотя 0 может быть очень маловероятно, что вы можете проверить, что используя Если и повторите генерацию случайных чисел.

1
int random(int N) 
{ 
    int x; 
    do{ 
    x=rand()%(N*2+1)-N; 
    }while(x==0); 
    return x; 
} 

Он выбирает число от -N до N, но продолжает это делать, если он равен 0.

Альтернативой, как это было предложено в комментариях, порождает ряд между -N и N-1 и увеличивает его, если его положительный или 0:

int random(int N) 
{ 
    int x;  
    x=rand()%(N*2)-N; 
    if(x>=0) x++; 
    return x; 
} 
+1

Выполнение, зависящее от случайного значения, может выполняться в течение длительного, долгого времени! Но вы можете избавиться от недетерминированного времени выполнения, уменьшив диапазон случайного результата на 1, а затем искусственно преобразуя любой результат 0 в недостающий граничный результат. Никакой цикл не нужен. –

+0

Я не согласен с вашим утверждением, что это займет «длинное, длинное время»: шансы x равны 0 (и, следовательно, повторение цикла) равны 1/(2N + 1), что довольно мало для больших значения N. Тем не менее, я включил ваше предложение в свой ответ, который, я думаю, дает лучшее решение для этой конкретной проблемы, поэтому спасибо :) – Wernsey

+0

А ... Я не сказал, что это «займет» времени, а скорее, что он «мог» занять много времени. Есть разница! :) Прошу прощения, если это звучит дерзко. Я работаю в программном обеспечении реального времени, где все, что не может быть гарантировано абсолютно гарантировано в какой-то детерминистский момент, «может занять много времени». С технической точки зрения, ваша первая версия - O (?), А ваша вторая версия - O (1) (или, в худшем случае, не сложнее, чем «rand»). Итак, с точки зрения детерминизма, ваша вторая версия - большое улучшение. Красиво сделано, кстати. Мое предложение «конвертировать 0 в границу» было бы не так красиво. –

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