Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Изучаю С, короткий и простой вопрос по коду
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Метценгерштейн
#include <stdlib.h>

int main (void) {

int n;
n =rand ();

printf("%8X", n);
printf("\n");
system("pause");

};

компилятор DEV++

Как я понял, ф-я rand- библиотечная, наверное, в этом инклуде и есть. т.е. я её просто вызываю с / или без параметров и получаю значение, потом его печатаю. Но, почему- то постоянно число 23 ??? Никакой случайности...
SysRq
Цитата
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
zltigo
Цитата(SysRq @ Sep 6 2008, 22:42) *
Use the srand function to seed the pseudorandom-number generator before calling rand.

Неверно расставленные акценты - даже после вызова srand() в одним и тем-же инициализаторм будет получена одна и та-же последовательность. Ключевое слово pseudorandom-number generator.
Посему для генерации случайного числа сие не пригодно, без исходного случайного числа sad.gif.
SysRq
Это не акценты, это названия функций выделены :) Но суть замечания весьма верная, автору темы надо осмыслить!
Метценгерштейн
Спасибо за ответ. Соответственно, есть вопросы.

srand( (unsigned)time( NULL ) );

что делает эта строка? вызывает ф-ю srand и передает в неё что? и для чего?

int rand100 = (((double) rand() /
(double) RAND_MAX) * RANGE_MAX + RANGE_MIN);

как в данном случае ограничивается диапазон от 0-100? Допустим, сгененировалось случайно 1000. 1000/100*100+0 и что получили?

спасибо
MrYuran
Цитата(Метценгерштейн @ Sep 7 2008, 12:59) *
что делает эта строка?
int rand100 = (((double) rand() / (double) RAND_MAX) * RANGE_MAX + RANGE_MIN);

((double) rand() / (double) RAND_MAX) формирует (псевдо)случайное число в интервале 0...1

Зачем оно умножается на RANGE_MAX и складывается с RANGE_MIN надеюсь, не надо объяснять
Метценгерштейн
с этим разобрался, теперь развивая тему сделал массив, и генерю случайное число 1000 раз. Вероятность случайности - если в диапазоне генерации- в моем случае от 0-9- при 1000 циклов каждый массив (я прибавляю по1) будет равен 100.

А теперь, что не получается

printf("%8d", summa [j] );

так все работает, пишет 10 массивов с суммой в каждом.
А как мне в процентах это сделать?

если разделить на 10, то отбросится знак после запятой. Если так
printf("%8f", summa [j]/10 );

то вообще 0.00000 и так 10 раз пишет. В чем ошибка?
MrYuran
Цитата(Метценгерштейн @ Sep 7 2008, 18:54) *
если разделить на 10, то отбросится знак после запятой. Если так
printf("%8f", summa [j]/10 );
то вообще 0.00000 и так 10 раз пишет. В чем ошибка?

Деление целочисленное. Результат < 1 округляется до 0.

Надо что-то типа (double)summa [j]/10.0
Метценгерштейн
почему вот так работает

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
Цитата(Метценгерштейн @ Sep 7 2008, 20:09) *
почему вот так работает
....

Перечитайте предыдущий ответ.

У Вас в первом случае вычисление проихводится в числах с плавающей точкой, так как переменная t объявлена как double (и, соответственно стандарту, число 10000 при вычислении приводится к типу double).
Во втором случае у Вас и summa [j] (по коду этого не видно, но я уверен на 99.9999%), и 10000 - целые числа. Поэтому вычисление производится в целых числах. И получившийся результат, как уже было сказано, <1 округляется в 0.
Сергей Борщ
Цитата(Метценгерштейн @ Sep 7 2008, 20:09) *
В чем тут ошибка моя?
Чтобы работало также: printf("%8f", summa [j]/10000.0 );
Керниган и Ритчи, раздел 2.7 "преобразования типов".
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.