Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
3132 /* main --- выводит N различных граней костей */3334 int main(int argc, char **argv)35 {36 int nfaces;37 int i, j, k;3839 if (argc !=2) {40 fprintf(stderr, "usage: %s number-die-facesn", argv[0]);41 exit(1);42 }4344 nfaces = atoi(argv[1]);4546 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 }5152 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 }5960 return 0;61 }Эта программа использует простую ASCII-графику для распечатывания подобия грани игральной кости. Вы вызываете ее с числом граней для вывода. Это вычисляется в строке 44 с помощью
atoi()atoi()Ключевой является строка 53, которая преобразует возвращаемое значение
rand()%j * 3die_faces$ <b>ch12-rand</b> 2 /* Вывести две кости */+-------+| || * * || |+-------++-------+| * * || * || * * |+-------+Интерфейс
rand()rand()rand()ch12-rand.c%rand()rand()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_MAXRAND_MAXRAND_MAXvoid srandom(unsigned int seed);Устанавливает начальное число. Если
srandom()char *initstate(unsigned int seed, char *state, size_t n);Инициализирует массив
stateseedsrandom()nstate