C에서 난수 생성

Jinku Hu 2023년10월12일
  1. randsrand 함수를 사용하여 C에서 난수 생성
  2. randomsrandom 함수를 사용하여 C에서 난수 생성
  3. getrandom 함수를 사용하여 C에서 난수 생성
C에서 난수 생성

이 기사에서는 C에서 난수를 생성하는 방법에 대한 몇 가지 방법을 소개합니다.

randsrand 함수를 사용하여 C에서 난수 생성

rand 함수는[0, RAND_MAX]범위의 정수를 제공 할 수있는 의사 난수 생성기를 구현합니다. 여기서RAND_MAX는 최신 시스템에서 231 -1입니다. rand함수 뒤에있는 생성기 알고리즘은 결정적입니다. 따라서 무작위 비트로 시드해야합니다.

srand 함수는 의사 난수 생성기를 시드하는 데 사용되며 이후rand를 호출하면 무작위 정수 시퀀스가 ​​생성됩니다. 단점은 rand구현이 균일하게 임의의 비트를 생성 할 것으로 예상되지 않는다는 것입니다. 따라서 rand함수는 암호화가 매우 민감한 애플리케이션에서 사용하지 않는 것이 좋습니다. 다음 예제는 임의성의 좋은 소스가 아닌 현재 시간 값으로 생성기를 시드합니다.

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

#define MAX 100000
#define SIZE 100
#define NUMS_TO_GENERATE 10

int main() {
  srand(time(NULL));
  for (int i = 0; i < NUMS_TO_GENERATE; i++) {
    printf("%d\n", rand() % MAX);
  }

  exit(EXIT_SUCCESS);
}

출력:

85084
91989
85251
85016
43001
54883
8122
84491
6195
54793

randomsrandom 함수를 사용하여 C에서 난수 생성

C 표준 라이브러리에서 사용할 수있는 또 다른 의사 난수 생성기는 random함수로 구현됩니다. 이 방법은 rand에 비해 선호되는 방법이지만 암호화 응용 프로그램은 민감한 코드에서 random기능을 사용해서는 안됩니다. random은 인수를 취하지 않으며[0, RAND_MAX]범위의long int 유형 정수를 반환합니다. 비교적 좋은 품질의 난수를 생성하려면 함수에 srandom함수를 추가하는 것이 좋습니다.

이전 예와 마찬가지로 time함수를 사용하여 현재 시간 값을 시드로 전달하므로 보안에 민감한 애플리케이션에서는 권장되지 않습니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/random.h>

#define MAX 100000
#define SIZE 100
#define NUMS_TO_GENERATE 10

int main() {
  srandom(time(NULL));
  for (int i = 0; i < NUMS_TO_GENERATE; i++) {
    printf("%ld\n", random() / MAX);
  }
  printf("\n");

  exit(EXIT_SUCCESS);
}

출력:

91
2019
2410
11784
9139
5858
5293
17558
16625
3069

getrandom 함수를 사용하여 C에서 난수 생성

getrandom은 이전에 제공된 두 가지 방법보다 훨씬 우수한 품질의 임의 비트를 얻는 Linux 전용 함수입니다. getrandom은 임의의 비트를 저장해야하는 버퍼를 가리키는void 포인터, 바이트 단위의 버퍼 크기, 특수 기능에 대한 플래그의 세 가지 인수를받습니다.

다음 예에서는 단일 unsigned정수를 생성합니다.이 주소의 주소는 &tmp가 임의의 비트를 저장하기위한 버퍼로 전달되고 크기는 sizeof연산자로 계산됩니다. 드문 시나리오에서getrandom이 비트를 검색하는 임의의 소스는 초기화되지 않을 수 있습니다. getrandom 함수를 호출하면 프로그램 실행이 차단됩니다. 따라서GRND_NONBLOCK 매크로 정의는 이러한 경우 즉시 오류 값 -1을 반환하는 함수의 세 번째 인수로 전달됩니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/random.h>
#include <time.h>

#define MAX 100000
#define SIZE 100
#define NUMS_TO_GENERATE 10

int main() {
  unsigned int tmp;

  getrandom(&tmp, sizeof(unsigned int), GRND_NONBLOCK) == -1
      ? perror("getrandom")
      : "";
  printf("%u\n", tmp);

  exit(EXIT_SUCCESS);
}
934103271
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C Operator