Метценгерштейн 0 6 сентября, 2008 Опубликовано 6 сентября, 2008 · Жалоба #include <stdlib.h> int main (void) { int n; n =rand (); printf("%8X", n); printf("\n"); system("pause"); }; компилятор DEV++ Как я понял, ф-я rand- библиотечная, наверное, в этом инклуде и есть. т.е. я её просто вызываю с / или без параметров и получаю значение, потом его печатаю. Но, почему- то постоянно число 23 ??? Никакой случайности... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NullPointer 0 6 сентября, 2008 Опубликовано 6 сентября, 2008 (изменено) · Жалоба Use the srand function to seed the pseudorandom-number generator before calling rand. // crt_rand.c // This program seeds the random-number generator // with the time, then displays 10 random integers. // #include <stdlib.h> #include <stdio.h> #include <time.h> int main( void ) { int i; // Seed the random-number generator with current time so that // the numbers will be different every time we run. // srand( (unsigned)time( NULL ) ); // Display 10 numbers. for( i = 0; i < 10;i++ ) printf( " %6d\n", rand() ); printf("\n"); // Usually, you will want to generate a number in a specific range, // such as 0 to 100, like this: { int RANGE_MIN = 0; int RANGE_MAX = 100; for (i = 0; i < 10; i++ ) { int rand100 = (((double) rand() / (double) RAND_MAX) * RANGE_MAX + RANGE_MIN); printf( " %6d\n", rand100); } } } © MSDN Изменено 6 сентября, 2008 пользователем SysRq Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 6 сентября, 2008 Опубликовано 6 сентября, 2008 · Жалоба Use the srand function to seed the pseudorandom-number generator before calling rand. Неверно расставленные акценты - даже после вызова srand() в одним и тем-же инициализаторм будет получена одна и та-же последовательность. Ключевое слово pseudorandom-number generator. Посему для генерации случайного числа сие не пригодно, без исходного случайного числа :(. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NullPointer 0 6 сентября, 2008 Опубликовано 6 сентября, 2008 · Жалоба Это не акценты, это названия функций выделены :) Но суть замечания весьма верная, автору темы надо осмыслить! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 7 сентября, 2008 Опубликовано 7 сентября, 2008 · Жалоба Спасибо за ответ. Соответственно, есть вопросы. srand( (unsigned)time( NULL ) ); что делает эта строка? вызывает ф-ю srand и передает в неё что? и для чего? int rand100 = (((double) rand() / (double) RAND_MAX) * RANGE_MAX + RANGE_MIN); как в данном случае ограничивается диапазон от 0-100? Допустим, сгененировалось случайно 1000. 1000/100*100+0 и что получили? спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 29 7 сентября, 2008 Опубликовано 7 сентября, 2008 · Жалоба что делает эта строка? int rand100 = (((double) rand() / (double) RAND_MAX) * RANGE_MAX + RANGE_MIN); ((double) rand() / (double) RAND_MAX) формирует (псевдо)случайное число в интервале 0...1 Зачем оно умножается на RANGE_MAX и складывается с RANGE_MIN надеюсь, не надо объяснять Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 7 сентября, 2008 Опубликовано 7 сентября, 2008 · Жалоба с этим разобрался, теперь развивая тему сделал массив, и генерю случайное число 1000 раз. Вероятность случайности - если в диапазоне генерации- в моем случае от 0-9- при 1000 циклов каждый массив (я прибавляю по1) будет равен 100. А теперь, что не получается printf("%8d", summa [j] ); так все работает, пишет 10 массивов с суммой в каждом. А как мне в процентах это сделать? если разделить на 10, то отбросится знак после запятой. Если так printf("%8f", summa [j]/10 ); то вообще 0.00000 и так 10 раз пишет. В чем ошибка? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 29 7 сентября, 2008 Опубликовано 7 сентября, 2008 · Жалоба если разделить на 10, то отбросится знак после запятой. Если так printf("%8f", summa [j]/10 ); то вообще 0.00000 и так 10 раз пишет. В чем ошибка? Деление целочисленное. Результат < 1 округляется до 0. Надо что-то типа (double)summa [j]/10.0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 7 сентября, 2008 Опубликовано 7 сентября, 2008 · Жалоба почему вот так работает for (j=0; j<10; j++) { doble t; t =summa [j]; printf("%8f", t/10000 ); printf("\n"); } а так не хочет. В чем тут ошибка моя? for (j=0; j<10; j++) { printf("%8f", summa [j]/10000 ); printf("\n"); } ??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vik0 0 7 сентября, 2008 Опубликовано 7 сентября, 2008 · Жалоба почему вот так работает .... Перечитайте предыдущий ответ. У Вас в первом случае вычисление проихводится в числах с плавающей точкой, так как переменная t объявлена как double (и, соответственно стандарту, число 10000 при вычислении приводится к типу double). Во втором случае у Вас и summa [j] (по коду этого не видно, но я уверен на 99.9999%), и 10000 - целые числа. Поэтому вычисление производится в целых числах. И получившийся результат, как уже было сказано, <1 округляется в 0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 7 сентября, 2008 Опубликовано 7 сентября, 2008 · Жалоба В чем тут ошибка моя?Чтобы работало также: printf("%8f", summa [j]/10000.0 ); Керниган и Ритчи, раздел 2.7 "преобразования типов". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться