2015-10-17 3 views
2

Когда я пытаюсь сгенерировать случайное число от 0 до int:C - ранда() по модулю 0

//Populate Currently Allocated Reasource for each customer 
for (i = 0; i < NUMBER_OF_CUSTOMERS; i++) 
{ 
    printf("%d:[ ",i); 
    for (j = 0; j < NUMBER_OF_RESOURCES; j++) 
    { 
     allocation[i][j] = rand() % maximum[i][j]; 
     printf("%d ",allocation[i][j]); 
    } 
    printf("] \n\n"); 
} 

Я получаю исключение с плавающей запятой, когда maximum[i][j] 0.

Существуют ли более эффективные средства создания случайного числа без floating point error, вызванного rand() % 0?

EDIT: Когда максимум 0, то выход случайное число должно быть просто 0.

+3

Спросите вы rmath-учительницу, почему деление на 0 не определено. – Olaf

+0

Являются ли 'alloc [] []' и 'maximum [] []' массивами 'int' или 'float's? –

ответ

0

Вы сказали:

Когда максимум 0 , выход случайного числа должен быть равен 0.

Вы можете добавить чек, чтобы позаботиться об этом.

if (maximum[i][j] == 0) 
{ 
    allocation[i][j] = 0; 
} 
else 
{ 
    allocation[i][j] = rand() % maximum[i][j]; 
} 
1

Попробуйте использовать это вместо

//Populate Currently Allocated Reasource for each customer 
for (i = 0; i < NUMBER_OF_CUSTOMERS; i++) 
{ 
    printf("%d:[ ",i); 
    for (j = 0; j < NUMBER_OF_RESOURCES; j++) 
    { 
     allocation[i][j] = maximum[i][j] ? (rand() % maximum[i][j]) : 0; 
     printf("%d ",allocation[i][j]); 
    } 
    printf("] \n\n"); 
} 
+0

Как называется этот формат? И где я могу найти документацию по ее использованию? – Sean

+0

I означает, что 'maximum [i] [j]' not 0 than assign '(rand()% maximum [i] [j])' to 'alloc [i] [j]' else назначить 0 для распределения [i] [j] ' – Mykola

+2

@Sean, найдите тройного оператора – Leeor

0

Вы можете использовать оператор ?: написать, что дополнительное условие аккуратно:

allocation[i][j] = maximum[i][j] ? (rand() % maximum[i][j]) : 0; 

: условное выражение: Если условие верно? Тогда значение X: В противном случае значение Y


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

Wikipedia

+0

Причина для downvote? – nikaltipar

2

Принимая a % b дает остаток при a делится на b. Таким образом, он всегда даст вам результат, который меньше b, и он не работает, когда b равно нулю, потому что вы не можете делить на ноль.

Если вы хотите получить случайное число от 0 до x, вам необходимо принять rand() % (x + 1).

+0

Что делать, если максимум отрицательный? – nikaltipar

+0

@naltipar Тогда все становится странным. Поведение оператора модуля с отрицательными числами определяется реализацией. http://stackoverflow.com/questions/7594508/modulo-operator-with-negative-values ​​ – duskwuff

0

Когда максимум равен 0, то выходной случайное число должно быть просто 0.

Оператор по модулю есть остаток после деления. Так как деление на ноль не определено, то есть по модулю 0.

Вам необходимо условие, чтобы предотвратить попытку деления на ноль. Вы можете сделать это с помощью if/else операторов или ternary operator (?:).Иными словами, измените это

allocation[i][j] = rand() % maximum[i][j]; 

к одному из следующих.

if (maximum[i][j] == 0) 
{ 
    allocation[i][j] = 0; 
} 
else 
{ 
    allocation[i][j] = (rand() % maximum[i][j]); 
} 

или

allocation[i][j] = (maximum[i][j] == 0) ? (rand() % maximum[i][j]) : 0; 
+0

Конечно, к лучшему или худшему, условие '(maximum [i] [j] == 0)' может быть дополнительно сокращено из-за 'maximum [i] [j]', так как 0 оценивается как false в C. Но я думаю, что явное условие более ясно. –