Я хочу генерировать случайные числа от -n до n, исключая 0. Может ли кто-нибудь предоставить мне код в C? Как исключить 0?Создание случайных чисел от -n до n в C
ответ
Одной из идей может быть создание случайного числа 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()
безопасно; это объясняет вышеупомянутое использование.
Спасибо. Крис только что отправил ответ до того, как я сделал это. – avd
Самое простое, что я могу предложить, чтобы сделать это, чтобы сгенерировать случайное число от 0 до 2л, а затем сделать математику трюк:
result= n - randomNumber
Хотя 0 может быть очень маловероятно, что вы можете проверить, что используя Если и повторите генерацию случайных чисел.
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, а затем искусственно преобразуя любой результат 0 в недостающий граничный результат. Никакой цикл не нужен. –
Я не согласен с вашим утверждением, что это займет «длинное, длинное время»: шансы x равны 0 (и, следовательно, повторение цикла) равны 1/(2N + 1), что довольно мало для больших значения N. Тем не менее, я включил ваше предложение в свой ответ, который, я думаю, дает лучшее решение для этой конкретной проблемы, поэтому спасибо :) – Wernsey
А ... Я не сказал, что это «займет» времени, а скорее, что он «мог» занять много времени. Есть разница! :) Прошу прощения, если это звучит дерзко. Я работаю в программном обеспечении реального времени, где все, что не может быть гарантировано абсолютно гарантировано в какой-то детерминистский момент, «может занять много времени». С технической точки зрения, ваша первая версия - O (?), А ваша вторая версия - O (1) (или, в худшем случае, не сложнее, чем «rand»). Итак, с точки зрения детерминизма, ваша вторая версия - большое улучшение. Красиво сделано, кстати. Мое предложение «конвертировать 0 в границу» было бы не так красиво. –
- 1. Создание n-мерных случайных чисел в Python
- 2. Создание списка из N случайных чисел между диапазоном чисел
- 3. Создайте n случайных чисел в интервале от 0 до k, где n может быть больше k
- 4. n случайных чисел в пределах параметров
- 5. Создание nCk комбинаций чисел от 0 до n-1
- 6. Создание списка квадратов от 1 до n
- 7. Выбор N случайных чисел из набора
- 8. Биективная функция от N * N * N до N
- 9. grep диапазон от N до N токенов
- 10. Сумма n случайных чисел (для целей моделирования)
- 11. Сгенерируйте n случайных чисел, суммированных до 100 VBA
- 12. N случайных выборов в зависимости от вероятности
- 13. Создайте N случайных целых чисел без пробелов
- 14. Как эффективно генерировать N случайных чисел от 0 до num в C#?
- 15. Создание N равномерных случайных чисел, которые суммируются с M
- 16. Создание отсортированных случайных чисел без сортировки? O (n)
- 17. Создание неповторяющихся случайных чисел
- 18. Создание неравных случайных чисел в C
- 19. Как сгенерировать n цифр случайных чисел?
- 20. Получение N случайных чисел, что сумма M
- 21. Печать простых чисел до n
- 22. C++ случайных чисел от -100 до 100
- 23. Создание уникальных случайных чисел
- 24. Создание списка случайных чисел, суммирование до 1
- 25. C - Создание n потоков
- 26. Сумма чисел до N-M в Prolog
- 27. Карта N целых чисел в [1, N]
- 28. Создание набора случайных чисел
- 29. Создание случайных чисел в C
- 30. Python: serial.readline() - как определить EOL от \ n до \ n \ n
Почему голос? Я хочу, чтобы этот сайт заставил людей добавлять комментарий, когда они голосуют. –