Вход/Регистрация
Linux программирование в примерах
вернуться

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

Шрифт:

17 " ",

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 */

  • Читать дальше
  • 1
  • ...
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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