реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Изучаю С, короткий и простой вопрос по коду, разбираюсь с ф-й rand
Метценгерштейн
сообщение Sep 6 2008, 20:27
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



#include <stdlib.h>

int main (void) {

int n;
n =rand ();

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

};

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

Как я понял, ф-я rand- библиотечная, наверное, в этом инклуде и есть. т.е. я её просто вызываю с / или без параметров и получаю значение, потом его печатаю. Но, почему- то постоянно число 23 ??? Никакой случайности...
Go to the top of the page
 
+Quote Post
SysRq
сообщение Sep 6 2008, 20:42
Сообщение #2


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата
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 - Sep 6 2008, 20:44
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 6 2008, 20:54
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(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.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
SysRq
сообщение Sep 6 2008, 21:49
Сообщение #4


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Это не акценты, это названия функций выделены :) Но суть замечания весьма верная, автору темы надо осмыслить!
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Sep 7 2008, 08:59
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



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

srand( (unsigned)time( NULL ) );

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

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

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

спасибо
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 7 2008, 09:31
Сообщение #6


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Метценгерштейн @ 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 надеюсь, не надо объяснять


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Sep 7 2008, 14:54
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



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

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

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

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

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

то вообще 0.00000 и так 10 раз пишет. В чем ошибка?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 7 2008, 15:11
Сообщение #8


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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

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

Надо что-то типа (double)summa [j]/10.0


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Sep 7 2008, 17:09
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



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

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");

}

???
Go to the top of the page
 
+Quote Post
vik0
сообщение Sep 7 2008, 17:24
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233



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

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

У Вас в первом случае вычисление проихводится в числах с плавающей точкой, так как переменная t объявлена как double (и, соответственно стандарту, число 10000 при вычислении приводится к типу double).
Во втором случае у Вас и summa [j] (по коду этого не видно, но я уверен на 99.9999%), и 10000 - целые числа. Поэтому вычисление производится в целых числах. И получившийся результат, как уже было сказано, <1 округляется в 0.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 7 2008, 18:19
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Метценгерштейн @ Sep 7 2008, 20:09) *
В чем тут ошибка моя?
Чтобы работало также: printf("%8f", summa [j]/10000.0 );
Керниган и Ритчи, раздел 2.7 "преобразования типов".


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 17:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01456 секунд с 7
ELECTRONIX ©2004-2016