Как я получаю определенный диапазон чисел от рэнда ()?

Проверка Индекс

jQuery имеет .index, но это - боль для использования, поскольку Вам нужны список элементов и передача в элементе, из которого Вы хотите индекс:

var index = e.g $('#ul>li').index( liDomObject );

следующее намного легче:

, Если Вы хотите знать индекс элемента в наборе (например, элементы списка) в рамках незаказанного списка:

$("ul > li").click(function () {
    var index = $(this).prevAll().length;
});
33
задан jww 30 March 2016 в 17:31
поделиться

11 ответов

rand() % (max_number + 1 - minimum_number) + minimum_number

Итак, для 0-65:

rand() % (65 + 1 - 0) + 0

(очевидно, вы можете оставить 0 выключенным, но для полноты).

Обратите внимание, что это немного изменит случайность, но, вероятно, не о чем беспокоиться, если вы не делаете что-то особо деликатное.

61
ответ дан 27 November 2019 в 17:32
поделиться

Если вы не слишком заботитесь о «случайности» младших битов, просто rand ()% HI_VAL.

Также:

(double)rand() / (double)RAND_MAX;  // lazy way to get [0.0, 1.0)
2
ответ дан 27 November 2019 в 17:32
поделиться
double scale = 1.0 / ((double) RAND_MAX + 1.0);
int min, max;
...
rval = (int)(rand() * scale * (max - min + 1) + min);
3
ответ дан 27 November 2019 в 17:32
поделиться

Я думаю, что следующее делает это частично правильно. Прошло некоторое время с тех пор, как я коснулся 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);
0
ответ дан 27 November 2019 в 17:32
поделиться

rand () вернет числа от 0 до RAND_MAX, что составляет не менее 32767.

Если вы хотите получить число в пределах диапазона, вы можете просто использовать по модулю.

int value = rand() % 66; // 0-65

Для большей точности ознакомьтесь с этой статьей . В нем обсуждается, почему modulo не обязательно является хорошим (плохие распределения, особенно на высоком уровне), и предлагаются различные варианты.

1
ответ дан 27 November 2019 в 17:32
поделиться

Наивный способ сделать это:

int myRand = rand() % 66; // for 0-65

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

Чтобы объяснить почему это не совсем единообразно, рассмотрим этот очень упрощенный пример:
Предположим, RAND_MAX равно 4, и вам нужно число от 0 до 2. Возможные значения, которые вы можете получить, показаны в этой таблице:

rand()   |  rand() % 3
---------+------------
0        |  0
1        |  1
2        |  2
3        |  0

Видите проблему? Если ваше максимальное значение не является четным делителем RAND_MAX, вы с большей вероятностью выберете небольшие значения. Однако, поскольку RAND_MAX обычно равен 32767, смещение, вероятно, будет достаточно небольшим, чтобы его можно было избежать для большинства целей.

Существуют различные способы обойти эту проблему; см. здесь для объяснения того, как Java Random обрабатывает это.

2
ответ дан 27 November 2019 в 17:32
поделиться

Как отмечали другие, простое использование модуля исказит вероятности для отдельных чисел, так что предпочтительны меньшие числа.

Очень оригинальное и хорошее решение этой проблемы используется в Java java.util.Random class:

public int nextInt(int n) {
    if (n <= 0)
        throw new IllegalArgumentException("n must be positive");

    if ((n & -n) == n)  // i.e., n is a power of 2
        return (int)((n * (long)next(31)) >> 31);

    int bits, val;
    do {
        bits = next(31);
        val = bits % n;
    } while (bits - val + (n-1) < 0);
    return val;
}

Мне потребовалось время, чтобы понять, почему это работает, и я оставляю это в качестве упражнения для читателя, но это довольно краткое решение, которое гарантирует, что числа имеют равные вероятности.

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

5
ответ дан 27 November 2019 в 17:32
поделиться

Обновлено, чтобы не использовать #define

double RAND(double min, double max)
{
    return (double)rand()/(double)RAND_MAX * (max - min) + min;
}
3
ответ дан 27 November 2019 в 17:32
поделиться

проверьте здесь

http://c-faq.com/lib/randrange.html

Для любого из этих методов при необходимости просто сместить диапазон; числа в диапазоне [M, N] могут быть сгенерированы с помощью чего-то вроде

M + rand() / (RAND_MAX / (N - M + 1) + 1)
16
ответ дан 27 November 2019 в 17:32
поделиться

Взяв результат по модулю, как утверждали другие плакаты, вы получите что-то, что почти случайное, но не совсем так.

Рассмотрим этот крайний пример, Предположим, вы хотите смоделировать подбрасывание монеты, возвращая либо 0, либо 1. Можно сделать следующее:

isHeads = ( rand() % 2 ) == 1;

Выглядит достаточно безобидно, не так ли? Предположим, что RAND_MAX всего 3. Конечно, он намного выше, но дело в том, что существует смещение, когда вы используете модуль, который не делит RAND_MAX равномерно. Если вам нужны случайные числа высокого качества, у вас возникнет проблема.

Рассмотрим мой пример. Возможные исходы:

rand()  freq. rand() % 2
0       1/3   0
1       1/3   1
2       1/3   0

Следовательно, «решка» будет выпадать в два раза чаще, чем «решка»!

Этвуд обсуждает этот вопрос в этой статье Coding Horror

6
ответ дан 27 November 2019 в 17:32
поделиться

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

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

, тогда просто укажите модуль.

0
ответ дан 27 November 2019 в 17:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: