Как сделать random.choice в C - PullRequest
0 голосов
/ 18 июня 2020

Как Python ученик среднего уровня, я сделал 8 мячей в Python. Теперь, когда я начинаю изучать C, есть ли способ имитировать способ, которым random.choice может выбирать строку из списка строк, но в C?

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

Наиболее близким к «списку строк» ​​в 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 ().

2 голосов
/ 18 июня 2020

Вы можете написать функцию, если знаете размер вашего массива и используете rand ()% size для получения случайного индекса из вашего массива. Затем верните значение arr [randidx]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...