jQuery имеет .index, но это - боль для использования, поскольку Вам нужны список элементов и передача в элементе, из которого Вы хотите индекс:
var index = e.g $('#ul>li').index( liDomObject );
следующее намного легче:
, Если Вы хотите знать индекс элемента в наборе (например, элементы списка) в рамках незаказанного списка:
$("ul > li").click(function () {
var index = $(this).prevAll().length;
});
rand() % (max_number + 1 - minimum_number) + minimum_number
Итак, для 0-65:
rand() % (65 + 1 - 0) + 0
(очевидно, вы можете оставить 0 выключенным, но для полноты).
Обратите внимание, что это немного изменит случайность, но, вероятно, не о чем беспокоиться, если вы не делаете что-то особо деликатное.
Если вы не слишком заботитесь о «случайности» младших битов, просто rand ()% HI_VAL.
Также:
(double)rand() / (double)RAND_MAX; // lazy way to get [0.0, 1.0)
double scale = 1.0 / ((double) RAND_MAX + 1.0);
int min, max;
...
rval = (int)(rand() * scale * (max - min + 1) + min);
Я думаю, что следующее делает это частично правильно. Прошло некоторое время с тех пор, как я коснулся 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);
rand () вернет числа от 0 до RAND_MAX, что составляет не менее 32767.
Если вы хотите получить число в пределах диапазона, вы можете просто использовать по модулю.
int value = rand() % 66; // 0-65
Для большей точности ознакомьтесь с этой статьей . В нем обсуждается, почему modulo не обязательно является хорошим (плохие распределения, особенно на высоком уровне), и предлагаются различные варианты.
Наивный способ сделать это:
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
обрабатывает это.
Как отмечали другие, простое использование модуля исказит вероятности для отдельных чисел, так что предпочтительны меньшие числа.
Очень оригинальное и хорошее решение этой проблемы используется в 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
, который отклоняет числа, попадающие в диапазон чисел, что в противном случае привело бы к неравномерному распределению.
Обновлено, чтобы не использовать #define
double RAND(double min, double max)
{
return (double)rand()/(double)RAND_MAX * (max - min) + min;
}
проверьте здесь
http://c-faq.com/lib/randrange.html
Для любого из этих методов при необходимости просто сместить диапазон; числа в диапазоне [M, N] могут быть сгенерированы с помощью чего-то вроде
M + rand() / (RAND_MAX / (N - M + 1) + 1)
Взяв результат по модулю, как утверждали другие плакаты, вы получите что-то, что почти случайное, но не совсем так.
Рассмотрим этот крайний пример, Предположим, вы хотите смоделировать подбрасывание монеты, возвращая либо 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
если вам важно качество случайных чисел, не используйте rand ()
, используйте другой prng, например http://en.wikipedia.org/wiki/ Mersenne_twister или другой высококачественный метод
, тогда просто укажите модуль.