Перейти к содержанию
    

Изучаю С, короткий и простой вопрос по коду

#include <stdlib.h>

 

int main (void) {

 

int n;

n =rand ();

 

printf("%8X", n);

printf("\n");

system("pause");

 

};

 

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

 

Как я понял, ф-я rand- библиотечная, наверное, в этом инклуде и есть. т.е. я её просто вызываю с / или без параметров и получаю значение, потом его печатаю. Но, почему- то постоянно число 23 ??? Никакой случайности...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем SysRq

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Use the srand function to seed the pseudorandom-number generator before calling rand.

Неверно расставленные акценты - даже после вызова srand() в одним и тем-же инициализаторм будет получена одна и та-же последовательность. Ключевое слово pseudorandom-number generator.

Посему для генерации случайного числа сие не пригодно, без исходного случайного числа :(.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это не акценты, это названия функций выделены :) Но суть замечания весьма верная, автору темы надо осмыслить!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответ. Соответственно, есть вопросы.

 

srand( (unsigned)time( NULL ) );

 

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

 

int rand100 = (((double) rand() /

(double) RAND_MAX) * RANGE_MAX + RANGE_MIN);

 

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

 

спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

что делает эта строка?

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 раз пишет. В чем ошибка?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если разделить на 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");

 

}

 

???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

почему вот так работает

....

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

 

У Вас в первом случае вычисление проихводится в числах с плавающей точкой, так как переменная t объявлена как double (и, соответственно стандарту, число 10000 при вычислении приводится к типу double).

Во втором случае у Вас и summa [j] (по коду этого не видно, но я уверен на 99.9999%), и 10000 - целые числа. Поэтому вычисление производится в целых числах. И получившийся результат, как уже было сказано, <1 округляется в 0.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В чем тут ошибка моя?
Чтобы работало также: printf("%8f", summa [j]/10000.0 );

Керниган и Ритчи, раздел 2.7 "преобразования типов".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...