Как получить определенный диапазон чисел из rand ()? - PullRequest
32 голосов
/ 30 июля 2009
srand(time(null));

printf("%d", rand());

Дает случайное число высокого диапазона (0-32000ish), но мне нужно только 0-63 или 0-127, хотя я не уверен, как это сделать. Любая помощь?

Ответы [ 17 ]

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

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

// the range is between [aMin, aMax]
double f = (double)rand() / RAND_MAX;
double result = aMin + f * (aMax - aMin);

Однако существует вероятность переполнения (aMax - aMin). Например. aMax = 1, aMin = -DBL_MAX. Более безопасный способ - написать так:

// the range is between [aMin, aMax]
double f = (double)rand() / RAND_MAX;
double result = aMin - f * aMin + f * aMax;

Исходя из этой концепции, подобное может вызвать проблемы.

rand() % (max_number + 1 - minimum_number) + minimum_number
// 1. max_number + 1 might overflow
// 2. max_number + 1 - min_number might overflow
0 голосов
/ 19 апреля 2019

Вы можете изменить его, добавив% перед функцией rand, чтобы перейти к коду

Например:

rand() % 50

даст вам случайное число в диапазоне 50. Для вас замените 50 на 63 или 127

0 голосов
/ 27 августа 2018

Простое использование rand () даст вам одинаковые случайные числа при многократном запуске программы. т.е. когда вы запускаете вашу программу в первый раз, она выдаст случайное число x, y и z. Если вы запустите программу еще раз, она выдаст те же числа x, y и z, как я наблюдал.

Решение, которое я нашел, чтобы сохранить его уникальным каждый раз, использует srand ()

Вот дополнительный код,

#include<stdlib.h>
#include<time.h>

time_t t;
srand((unsigned) time(&t));
int rand_number = rand() % (65 + 1 - 0) + 0 //i.e Random numbers in range 0-65.

Для задания диапазона вы можете использовать формулу: rand ()% (max_number + 1 - минимальный_номер) + минимальный_номер

Надеюсь, это поможет!

0 голосов
/ 22 июня 2018
2 cents (ok 4 cents):

n = rand()
x = result
l = limit

n/RAND_MAX = x/l

Refactor:

(l/1)*(n/RAND_MAX) = (x/l)*(l/1)

Gives:

x = l*n/RAND_MAX

int randn(int limit)

{

    return limit*rand()/RAND_MAX;

}

int i;

for (i = 0; i < 100; i++) { 

    printf("%d ", randn(10)); 
    if (!(i % 16)) printf("\n"); 

}

> test
0
5 1 8 5 4 3 8 8 7 1 8 7 5 3 0 0
3 1 1 9 4 1 0 0 3 5 5 6 6 1 6 4
3 0 6 7 8 5 3 8 7 9 9 5 1 4 2 8
2 7 8 9 9 6 3 2 2 8 0 3 0 6 0 0
9 2 2 5 6 8 7 4 2 7 4 4 9 7 1 5
3 7 6 5 3 1 2 4 8 5 9 7 3 1 6 4
0 6 5
0 голосов
/ 10 апреля 2018

Просто чтобы добавить дополнительные детали к существующим ответам.

Операция mod % всегда будет выполнять полное деление и, следовательно, даст остаток меньше делителя.

x% y = x - (y * этаж ((x / y)))

Пример функции поиска случайного диапазона с комментариями:

uint32_t rand_range(uint32_t n, uint32_t m) {
    // size of range, inclusive
    const uint32_t length_of_range = m - n + 1;

    // add n so that we don't return a number below our range
    return (uint32_t)(rand() % length_of_range + n);
}

Еще одно интересное свойство, как указано выше:

x% y = x, если x

const uint32_t value = rand_range(1, RAND_MAX); // results in rand() % RAND_MAX + 1
// TRUE for all x = RAND_MAX, where x is the result of rand()
assert(value == RAND_MAX);
result of rand()
0 голосов
/ 05 августа 2009

, если вы заботитесь о качестве случайных чисел, не используйте rand ()

используйте какой-нибудь другой prng, например http://en.wikipedia.org/wiki/Mersenne_twister или один из других высококачественных prng-ов

тогда просто иди с модулем.

0 голосов
/ 30 июля 2009

Я думаю, что следующее делает это почти правильно. Прошло некоторое время с тех пор, как я коснулся C. Идея состоит в том, чтобы использовать деление, поскольку модуль не всегда дает случайные результаты. Я добавил 1 к RAND_MAX, так как есть много возможных значений, идущих от rand, включая 0. И так как диапазон также равен 0, я также добавил туда 1. Я думаю, что математика устроена правильно, избегайте целочисленных математических задач.

#define MK_DIVISOR(max) ((int)((unsigned int)RAND_MAX+1/(max+1)))

num = rand()/MK_DIVISOR(65);
...