Как сгенерировать случайный int в C? - PullRequest
510 голосов
/ 05 мая 2009

Есть ли функция для генерации случайного целого числа в C? Или мне придется использовать стороннюю библиотеку?

Ответы [ 24 ]

4 голосов
/ 05 мая 2009

Вы хотите использовать rand(). Примечание ( ОЧЕНЬ ВАЖНО ): обязательно установите начальное значение для функции ранда Если вы этого не сделаете, ваши случайные числа не являются действительно случайными . Это очень, очень, очень важно. К счастью, вы можете использовать некоторую комбинацию таймера системных тиков и даты, чтобы получить хорошее начальное число.

4 голосов
/ 28 августа 2014

Это хороший способ получить случайное число между двумя числами по вашему выбору.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

    #define randnum(min, max) \
        ((rand() % (int)(((max) + 1) - (min))) + (min))

int main()
{
    srand(time(NULL));

    printf("%d\n", randnum(1, 70));
}

Вывод в первый раз: 39

Выход во второй раз: 61

Вывод в третий раз: 65

Вы можете изменить значения после randnum на любые выбранные вами числа, и это сгенерирует случайное число для вас между этими двумя числами.

4 голосов
/ 27 августа 2015

Надеюсь, это немного более случайно, чем просто использование srand(time(NULL)).

#include <time.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    srand((unsigned int)**main + (unsigned int)&argc + (unsigned int)time(NULL));
    srand(rand());

    for (int i = 0; i < 10; i++)
        printf("%d\n", rand());
}
3 голосов
/ 22 августа 2017

C Программа для генерации случайного числа от 9 до 50

#include <time.h>
#include <stdlib.h>

int main()
{
    srand(time(NULL));
    int lowerLimit = 10, upperLimit = 50;
    int r =  lowerLimit + rand() % (upperLimit - lowerLimit);
    printf("%d", r);
}

В общем случае мы можем генерировать случайное число между lowerLimit и upperLimit-1

то есть lowerLimit включительно или, скажем, r ∈ [lowerLimit, upperLimit)

3 голосов
/ 05 мая 2009

Ну, STL - это C ++, а не C, поэтому я не знаю, что вы хотите. Если вы хотите C, однако, есть функции rand() и srand():

int rand(void);

void srand(unsigned seed);

Они оба являются частью ANSI C. Существует также функция random():

long random(void);

Но, насколько я могу судить, random() не является стандартным ANSI C. Сторонняя библиотека может быть неплохой идеей, но все зависит от того, насколько случайным образом число вам действительно нужно сгенерировать. *

2 голосов
/ 23 ноября 2013

rand() - наиболее удобный способ генерации случайных чисел.

Вы также можете поймать случайное число с любого онлайн-сервиса, например random.org.

2 голосов
/ 14 ноября 2014
#include <stdio.h>
#include <stdlib.h>

void main() 
{
    int visited[100];
    int randValue, a, b, vindex = 0;

    randValue = (rand() % 100) + 1;

    while (vindex < 100) {
        for (b = 0; b < vindex; b++) {
            if (visited[b] == randValue) {
                randValue = (rand() % 100) + 1;
                b = 0;
            }
        }

        visited[vindex++] = randValue;
    }

    for (a = 0; a < 100; a++)
        printf("%d ", visited[a]);
}
1 голос
/ 13 ноября 2017

На современных процессорах x86_64 вы можете использовать аппаратный генератор случайных чисел через _rdrand64_step()

Пример кода:

#include <immintrin.h>

uint64_t randVal;
if(!_rdrand64_step(&randVal)) {
  // Report an error here: random number generation has failed!
}
// If no error occured, randVal contains a random 64-bit number
1 голос
/ 24 февраля 2014
#include <stdio.h>
#include <dos.h>

int random(int range);

int main(void)
{
    printf("%d", random(10));
    return 0;
}

int random(int range)
{
    struct time t;
    int r;

    gettime(&t);
    r = t.ti_sec % range;
    return r;
}
0 голосов
/ 17 ноября 2017

Несмотря на все предложения людей rand() здесь, вы не хотите использовать rand(), если вам не нужно! Случайные числа, которые выдает rand(), часто бывают очень плохими. Цитата из справочной страницы Linux:

Версии rand() и srand() в библиотеке Linux C используют тот же генератор случайных чисел, что и random(3) и srandom(3), поэтому биты младшего разряда должны быть такими же случайными, как биты старшего разряда. Однако в более старых реализациях rand () и в текущих реализациях в разных системах биты младшего разряда намного менее случайны, чем биты высшего порядка . Не используйте эту функцию в приложениях, предназначенных для переноса, когда необходима хорошая случайность. ( Вместо этого используйте random(3). )

Что касается переносимости, random() также определяется стандартом POSIX уже довольно давно. rand() старше, он появился уже в первой спецификации POSIX.1 (IEEE Std 1003.1-1988), тогда как random() впервые появился в POSIX.1-2001 (IEEE Std 1003.1-2001), однако текущий стандарт POSIX уже POSIX.1-2008 (стандарт IEEE 1003.1-2008), который получил обновление всего год назад (стандарт IEEE 1003.1-2008, издание 2016 г.). Поэтому я считаю random() очень портативным.

POSIX.1-2001 также представил функции lrand48() и mrand48(), см. Здесь :

Это семейство функций должно генерировать псевдослучайные числа, используя линейный конгруэнтный алгоритм и 48-разрядную целочисленную арифметику.

И довольно хорошим псевдослучайным источником является функция arc4random(), которая доступна во многих системах. Не является частью какого-либо официального стандарта, появившегося в BSD в 1997 году, но его можно найти в таких системах, как Linux и macOS / iOS.

...