Наиболее близким к «списку строк» в C является массив указателей на строки; и единственная стандартная библиотечная функция, которая производит случайные числа, - это rand()
, определенное в <stdlib.h>
.
Простой пример:
#include <stdio.h>
#include <stdlib.h>
#include <time.h> // needed for the usual srand() initialization
int main(void)
{
const char *string_table[] = { // array of pointers to constant strings
"alpha",
"beta",
"gamma",
"delta",
"epsilon"
};
int table_size = 5; // This must match the number of entries above
srand(time(NULL)); // randomize the start value
for (int i = 1; i <= 10; ++i)
{
const char *rand_string = string_table[rand() % table_size];
printf("%2d. %s\n", i, rand_string);
}
return 0;
}
Это сгенерирует и напечатает десять случайных вариантов из массив из пяти строк.
Переменная string_table
- это массив const char *
указателей. Вы всегда должны использовать постоянный указатель для ссылки на строку буквальных символов, например "alpha"
. Это не дает вам использовать этот указатель в контексте, в котором содержимое строки может быть изменено.
Случайные числа называются «псевдослучайными»; статистически некоррелировано, но полностью определяется начальным «начальным» значением. При использовании оператора srand(time(NULL))
берется текущее значение времени / даты (в секундах с некоторой начальной даты) и используется как начальное значение, которое не будет повторяться в течение жизни любого компьютера. Но вы получите точно такие же «случайные» числа, если вам удастся запустить программу дважды за одну и ту же секунду. Это легко сделать, например, в сценарии оболочки. Временная метка с более высоким разрешением была бы хороша, но в стандартной библиотеке C нет ничего полезного.
Функция rand()
возвращает неотрицательное значение int от 0 до некоторого зависящего от реализации максимума стоимость. Это значение имеет символ i c константа RAND_MAX
. Выражение rand() % N
вернет остаток от деления этого значения на N, которое является числом от 0
до N-1
.
Аконкагуа указал, что это не идеально. Если N не делит RAND_MAX
равномерно, тогда будет смещение в сторону меньших чисел. Хотя пока это нормально, но планируйте изучить некоторые другие методы позже, если вы будете серьезно заниматься моделированием или статистической работой; и если вы дойдете до этого момента, вы, вероятно, все равно не будете использовать встроенную функцию rand ().