Чтение онлайн

на главную

Жанры

Linux программирование в примерах

Роббинс Арнольд

Шрифт:

18

19 " * * ",

20 " ", /* 4 */

21 " * * ",

22

23 " * * ",

24 " * ", /* 5 */

25 " * * ",

26

27 " * * * ",

28 " ", /* 6 */

29 " * * * ",

30 };

31

32 /* main --- выводит N различных
граней костей */

33

34 int main(int argc, char **argv)

35 {

36 int nfaces;

37 int i, j, k;

38

39 if (argc !=2) {

40 fprintf(stderr, "usage: %s number-die-faces\n", argv[0]);

41 exit(1);

42 }

43

44 nfaces = atoi(argv[1]);

45

46 if (nfaces <= 0) {

47 fprintf(stderr, "usage: %s number-die-faces\n", argv[0]);

48 fprintf(stderr, "\tUse a positive number!\n");

49 exit(1);

50 }

51

52 for (i = 1; i <= nfaces; i++) {

53 j = rand % 6; /* force to range 0 <= j <= 5 */

54 printf("+-------+\n" );

55 for (k = 0; k < 3; k++)

56 printf("|%s|\n", die_faces[(j * 3) + k]);

57 printf ("+-------+\n\n");

58 }

59

60 return 0;

61 }

Эта программа использует простую ASCII-графику для распечатывания подобия грани игральной кости. Вы вызываете ее с числом граней для вывода. Это вычисляется в строке 44 с помощью

atoi
. (В общем,
atoi
следует избегать в коде изделия, поскольку она не осуществляет проверку на ошибки или переполнение, также как не проверяет вводимые данные.)

Ключевой является строка 53, которая преобразует возвращаемое значение

rand
в число от нуля до пяти, используя оператор остатка,
%
. Значение '
j * 3
' действует в качестве начального индекса массива
die_faces
для трех строк, составляющих каждую грань кости. Строки 55 и 56 выводят саму грань. При запуске появляется вывод наподобие этого:

$ ch12-rand 2 /* Вывести две кости */

+-------+

| |

| * * |

| |

+-------+

+-------+

| * * |

| * |

| * * |

+-------+

Интерфейс

rand
восходит еще к V7 и PDP-11. В частности, на многих системах результатом является лишь 16-разрядное число, что значительно ограничивает диапазон чисел, которые могут быть возвращены. Более того, используемый им
алгоритм по современным стандартам считается «слабым». (Версия
rand
GLIBC не имеет этих проблем, но переносимый код должен быть написан со знанием того, что
rand
не является лучшим API для использования.)

ch12-rand.c
использует для получения значения в определенном интервале простую методику: оператор
%
. Эта методика использует младшие биты возвращенного значения (как при десятичном делении, когда остаток отделения на 10 или 100 использует одну или две младшие десятичные цифры). Оказывается, исторический генератор
rand
производил лучшие случайные значения в средних и старших битах по сравнению с младшими битами. Поэтому, если вы должны использовать
rand
, постарайтесь избежать младших битов. Справочная страница GNU/Linux rand(3) цитирует «Числовые рецепты на С» [129] , которая рекомендует эту методику:

129

Numerical Recipes in С. The Art of Scientific Computing,, 2nd edition, by William H. Press, Brian P. Plannery, Saul A. Teukolsky, and William T. Vetterling. Cambridge University Press, USA, 1993, ISBN 0-521-43108-5 — Примеч. автора.

j = 1+ (int)(10.0*rand/(RAND_MAX+1.0)); /* для числа от 1 до 10 */

12.6.2. Функции POSIX:

random
и
srandom

BSD 4.3 ввело random и сопровождающие ее функции. Эти функции используют намного более подходящий генератор случайных чисел, который возвращает 31-разрядное значение. Теперь они входят в расширение XSI, стандартизованное POSIX:

#include <stdlib.h> /* XSI */

long random(void);

void srandom(unsigned int seed);

char *initstate(unsigned int seed, char *state, size_t n);

char *setstate(char *state);

Первые две функции близко соответствуют

rand
и
srand
и могут использоваться сходным образом. Однако, вместо одного начального значения, которое дает последовательность псевдослучайных чисел, эти функции используют начальное значение вместе с массивом состояния: массивом байтов, который хранит сведения о состоянии для вычисления псевдослучайных чисел. Последние две функции дают возможность управлять массивом состояния.

long random(void);

Возвращает число в диапазоне от 0 до 231– 1. (Хотя справочная страница GNU/Linux random(3) говорит между 0 и

RAND_MAX
, это верно лишь для систем GLIBC, где
RAND_MAX
равен 231– 1. На других системах
RAND_MAX
может быть меньше. POSIX явно называет диапазон от 0 до 231– 1.)

void srandom(unsigned int seed);

Устанавливает начальное число. Если

srandom
никогда не вызывается, по умолчанию используется 1.

Поделиться:
Популярные книги

Мимик!

Северный Лис
1. Сбой Системы!
Фантастика:
боевая фантастика
5.40
рейтинг книги
Мимик!

Измена. Жизнь заново

Верди Алиса
1. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Жизнь заново

Я Гордый Часть 3

Машуков Тимур
3. Стальные яйца
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я Гордый Часть 3

Я Гордый часть 2

Машуков Тимур
2. Стальные яйца
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я Гордый часть 2

Счастливый торт Шарлотты

Гринерс Эва
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Счастливый торт Шарлотты

Академия

Кондакова Анна
2. Клан Волка
Фантастика:
боевая фантастика
5.40
рейтинг книги
Академия

Кодекс Охотника. Книга XXIII

Винокуров Юрий
23. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXIII

Поступь Империи

Ланцов Михаил Алексеевич
7. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Поступь Империи

Я все еще граф. Книга IX

Дрейк Сириус
9. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я все еще граф. Книга IX

Неверный. Свободный роман

Лакс Айрин
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Неверный. Свободный роман

Стеллар. Трибут

Прокофьев Роман Юрьевич
2. Стеллар
Фантастика:
боевая фантастика
рпг
8.75
рейтинг книги
Стеллар. Трибут

Темный Лекарь 4

Токсик Саша
4. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 4

Сердце Дракона. Предпоследний том. Часть 1

Клеванский Кирилл Сергеевич
Сердце дракона
Фантастика:
фэнтези
5.00
рейтинг книги
Сердце Дракона. Предпоследний том. Часть 1

Курсант: Назад в СССР 10

Дамиров Рафаэль
10. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: Назад в СССР 10