2013-03-08 5 views
0
main() 
{ 
    int i; 
    srand((int)time(NULL)); 
    for(i = 0; i < 10; i++) 
    printf("%f\n", randomInRange(0, 100)); // %f instead of %d 
} 

int randomInRange(int lo, int hi) 
{ 

    double d = (double)rand()/((double)RAND_MAX + 1); 
    int k = (int)(d * (hi - lo + 1)); 
    return k+lo; 
} 

при использовании% D, чтобы напечатать значение, он хорошо работает
но если я выбираю% е вместо% г, он генерирует 0 только
почему?Почему генератор случайных чисел генерирует только ноль

+4

Символ 'float' не 'int' не является' float' ... –

+1

Поскольку 'printf' не выполняет преобразования? Попробуйте 'printf ("% f \ n ", (float) randomInRange (0, 100));' – Pubby

+1

Я предлагаю вам использовать '-Wformat', если он поддерживается вашим компилятором. – Will

ответ

3

Раздел 7.21.6.1p9 из n1570.pdf (стандарт C) говорит, по отношению к Printf:

... Если какой-либо аргумент не правильный тип для спецификации преобразования соответствующих , то поведение не определено.

Раздел 7.21.6.1p8 состояния правильного типа для формата %f спецификатора:

F, Fdouble аргумент, представляющий число с плавающей точкой преобразуется в десятичной системе счисления в стиле [-] ddd.ddd, где число цифр после символа десятичной точки равно заданной точности .

randomInRange возвращает int. Очевидно, что int не является двойным, поэтому поведение не определено. Курица может бегать и прыгать, несмотря на то, что голова отсутствует ... Этот курица может или не может заставить кого-то упасть и сломать себе шею. Избегайте безголовых цыплят и неопределенного поведения.

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

2

Причина в том, что маленькие целые числа (< 2^23) интерпретируются как поплавки действительно маленький.

s eeeeeee emmmmmmm mmmmmmmm mmmmmmmm == sign * 1.mmmmmm * 2^(eeeee - 128) 
0 0000000 00000000 00000000 11111111 == 255 as integer 

Это 32-битовое целое число разделить на куски и интерпретируется как поплавок около 255 * 2^-128, или около 3.57e-43, который показан как правильно 0.0.

Вы также можете попробовать распечатать его как «% e», который показывает научное представление, или «% g», которое показывает «наименьшее точное» представление.

+0

, так что вы имеете в виду, что результат не «неопределен», как сказал @modifiable lvalue? Это слишком мало, чтобы его интерпретировать ... верно? – Bin

+0

Даже неопределенное поведение _is_ обычно что-то. Изменение спецификатора на выходы «% g» 6.95316e-310, который фактически имеет тип double, но я думаю, что точка доказана. –

0

Я знаю очень простой и хороший способ Рандомайз число в с

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

srand(time(NULL)); 

int r = rand()%100; 

просто написать это в C, и случайное число, будет введен в «г»

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