e-knigi.com
Электронные книги онлайн » Компьютеры и Интернет » Программирование » Linux программирование в примерах - Роббинс Арнольд

Linux программирование в примерах - Роббинс Арнольд

На этом ресурсе Вы можете бесплатно читать книгу онлайн Linux программирование в примерах - Роббинс Арнольд. Жанр: Программирование . На сайте e-Knigi.com Вы можете онлайн читать полную версию книги без регистрации и sms. Так же Вы можете ознакомится с содержанием, описанием, предисловием о произведении
Перейти на страницу:

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-facesn", argv[0]);

41   exit(1);

42  }

43

44  nfaces = atoi(argv[1]);

45

46  if (nfaces <= 0) {

47   fprintf(stderr, "usage: %s number-die-facesn", 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 ("+-------+nn");

58  }

59

60  return 0;

61 }

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

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

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

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

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

+-------+

|       |

| *   * |

|       |

+-------+

+-------+

| *   * |

|   *   |

| *   * |

+-------+

Интерфейс

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

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

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 &lt;stdlib.h&gt; /* 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.

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

Инициализирует массив

state
информацией для использования при генерации случайных чисел,
seed
является начальным значением, как для
srandom()
, а
n
является числом байтов в массиве
state
.

Перейти на страницу:

Роббинс Арнольд читать все книги автора по порядку

Роббинс Арнольд - на сайте онлайн книг e-Knigi.com Вы можете читать полные версии книг автора в одном месте.


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

Отзывы читателей о книге Linux программирование в примерах, автор: Роббинс Арнольд. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администрация сайта e-Knigi.com


Прокомментировать
Подтвердите что вы не робот:*