Школа создателей компьютерных игр

BannerDrive.ru
[Главная] [С чего начать?] [Дистанционное обучение] [Статьи] [Обучалки] [Книги] [Софт] [Форум] [Ссылки] [О сайте]

Случайные числа



Подпишитесь на рассылку "Создание компьютерных игр"

Рассылки Subscribe.Ru
Создание компьютерных игр

Рассылка выходит раз в месяц.


Понравился сайт? Узнайте, как помочь сайту.


Рекомендуемые книги


Андре Ламот.
Программирование трехмерных игр для Windows. Советы профессионала по трехмерной графике и растеризации


Андре Ламот.
Программирование игр для Windows. Советы профессионала


Проголосуйте за сайт в рейтинге GameTop!
(нажмите на кнопку рейтинга)

GameTop - рейтинг игровых ресурсов. Портал Rolemancer (www.rolemancer.ru)

Не забывайте, что результаты рейтинга обновляются раз в неделю. Пожалуйста, голосуйте почаще!


Статистика посещаемости

Rambler's Top100

Функции часть 2 | Все обучалки раздела | Массивы

Описание

Объясняется, как создавать случайные числа, и как убедиться, что создаваемые числа действительно являются случайными.

Программа создает случайные числа различными способами и выводит их на экран.

Скачать обучалку (Visual C++ 6)

Работа программы

Исходный код

// Done by TheTutor -- 1/28/02

// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com

/* Случайные числа используются во всех играх бесчисленное количество раз. К счастью,
язык С позволяет легко генерировать случайные числа. Эта обучалка покажет вам как создавать
целые случайные числа и как смещать генератор случайных чисел. */


#include <windows.h> // Мы подключаем этот заголовочный файл, 
                                     // чтобы можно было вызвать функцию GetTickCount()
#include <stdio.h>       // Мы подключаем "stdio.h" для использования printf()


int main()
{
      int num1 = rand(); /* Это и есть функция, которая создает случайные числа.
                                      Функция возвращает целое случайное число. Она не требует
                                      никаких параметров и возвращает случайное число между нулем
                                      и RAND_MAX (которое обычно равно 32767) */
                                    
      printf("A call to rand() gave us: %d\n\n", num1); // Печатаем это число на экран

      /* Следующий вопрос такой: Прекрасно, у меня есть целое случайное число. А что, если мне
         нужно, чтобы оно было, например, от 0 до 10? Как мне это сделать? Для этого есть ОЧЕНЬ
         полезная математическая операция, называемая "оператор mod" (%). Он возвращает остаток
         от деления. Пример:


         5 % 2 = 1            5 разделить на 2 равно 2 и 1/2.  Как вы видите, 5 % 2 дает число 1
                                    что является остатком от деления.

         Еще один пример:

         39 % 6 = 3            Итак, что будет при 39 / 6 -- Число 6 содержится в 39 шесть раз, что
                                    дает 36 и остаток 3 -- Этот остаток (3) и есть то, что дает оператор mod
                              
                                
         Какое это имеет отношение к функции rand()? Все очень просто. Для того, чтобы получить
         случайное число в диапазоне (например 0 - 9), вы берете остаток от деления rand() на число,
         на ЕДИНИЦУ больше чем НАИБОЛЬШЕЕ число диапазона. Рассмотрим на примерах:         */


      num1 = rand()%15; // num1 будет равняться числу между 0 - 14 включительно

      printf("rand()%15 = %d\n\n",num1);  // Напечатаем num1 чтобы проверить
      
      num1 = rand()%35; // num1 равняться числу между 0 - 34 включительно

      printf("rand()%35 = %d\n\n",num1); // Напечатаем num1 чтобы проверить


      /* Отлично, мы можем генерировать случайные числа. Одна проблема. Если вы запустите программу,
         вы заметите, что создаваемые "случайные числа" каждый раз одни и те же! Все это потому что
         rand() работает так, как будто из огромного массива чисел берется первое число, когда функция
         вызывается первый раз, второе число во второй раз и т.д. То что нам нужно, это сказать 
         программе "Не начинать с начала массива, начинать отсюда". Таким образом мы получим гораздо
         более случайные числа. Функция srand() дает нам такую возможность. srand() "смещает генератор
         случайных чисел", что дает нам действительно случайные числа КАЖДЫЙ РАЗ когда мы запускаем 
         приложение. srand() говорит "Начинать ОТСЮДА в массиве случайных чисел". Проблема в том, что
         если начинать каждый раз с одного места массива, это не лучше, чем начинать с его начала.

         Есть два основных способа указать различную стартовую точку, и оба они используют то, что
         постоянно меняется: время. */

      srand(GetTickCount()); /* srand() смещает генератор случайных чисел -- Смещение, которое
                                            мы передаем, указывается функцией GetTickCount(). Эта функция
                                            возвращает число миллисекунд, прошедших с начала запуска системы
                                            (которое определенно всегда различно, что означает, наше смещение
                                            всегда будет различно, что означает, мы получим действительно
                                            случайные числа. */
      
      num1 = rand()%100;        /* Число num1 будет входить в диапазон от 0 до 99 включительно
                                           Если вы будете запускать программу несколько раз, это число
                                           будет ЕДИНСТВЕННЫМ, которое будет меняться, остальные будут
                                           оставаться теми же самыми (хотя технически они создаются 
                                           случайно, при их создании каждый раз используется одинаковый
                                           алгоритм). */
      
      printf("rand()%100 = %d\n",num1); // Напечатать num1 на экран, чтобы проверить

      return 0; // Возвратить 0 чтобы сказать "Программа успешно завершена"
}

/* Кратко повторим все еще раз:

   Чтобы получить действительно случайные числа, обязательно используйте srand() - Для указания
   смещения, вы можете использовать GetTickCount() - Чтобы получить случайное число от 0 до 9, 
   нужно взять остаток (%) от деления результата вызова rand() на 10 - В общем виде, чтобы получить
   случайное число между 0 и Х, нужно сделать следующее:

   int rand_number = rand()%(X + 1);

   Если вы НЕ хотите использовать GetTickCount(), есть другой способ сместить генератор случайных
   чисел (хотя GetTickCount() делает это лучше всего) -- Вот пример программы, использующая другой
   способ:



  #include <stdio.h>
  #include <time.h>


  int main()
  {
      srand(time(NULL));

      int x = rand()%255;

      printf("%d",x);

      return 0;
  }

*/

/*
|  TheTutor 
|  thetutor@gametutorials.com 
|  © 2001-2002 GameTutorials 
*/

// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com

Скачать обучалку (Visual C++ 6)

Функции часть 2 | Все обучалки раздела | Массивы

[Главная] [С чего начать?] [Дистанционное обучение] [Статьи] [Обучалки] [Книги] [Софт] [Форум] [Ссылки] [О сайте]

Copyright © 2003-2005 Евгений Казеко. Все права защищены. E-mail: evgeniy@kazeko.com

фанера влагостойкая купить , ремонт компьютеров медведково