2015-07-01 3 views
4

я следующая функция, которая генерирует случайное число в диапазоне от -10 до 2:Случайный диапазон номеров, исключить 0

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

static int 
getRandomReturnCode(void) 
{ 
    int N = 2, 
     M = -10; 

    srand(time(NULL)); 

    r = M + rand()/(RAND_MAX/(N - M + 1) + 1); 

    if (r == 0){ 
     getRandomReturnCode(); 
    } 

    return r; 
} 

В настоящее время, если код возврата 0 (успех) возвращается, он будет рекурсивно называть функция до тех пор, пока не будет получен и возвращен ненулевой код возврата. Что я могу сделать для улучшения моего кода, так что 0 исключается из диапазона случайно выбранных чисел?

+6

Создайте число от -10 до 1, и если значение равно 0 или 1, добавьте его к нему. – clcto

+5

Не вызывайте 'srand' более одного раза. Поместите его в 'main'. –

+0

Создать число от 1 до 13? -13 и -1? – moffeltje

ответ

7

Что бы вы ни делали, не перерисовать, если возвращаемое значение равно 0: это приведет к статистическому смещению результата.

Лучшее, что нужно сделать, это провести между -10 и 1 включительно и добавить 1 к любому отрицательному выводу.

Наконец, позвоните по телефону srand иначе вы разрушите статистические свойства генератора.

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

+1

Пожалуйста, объясните (или укажите источник). Это кажется противоречивым (как многие вещи делают в этой области). –

+0

Опасность не перерисовывания кажется небольшим по сравнению с нечитаемым смещением '-10 + rand()/(RAND_MAX/13 + 1)'. – chux

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