C++의 큰 난수 에 관 한 문 제 를 간단히 이야기 하 다.

4222 단어 c + +난수
머리말
다 들 아시 다시 피 C++의 난수 최대 치 는 RAND 입 니 다.MAX,헤더 파일에서 정의 합 니 다.윈도 우즈 플랫폼 아래 의 VS 는 0x7fff 이 고 맥 북 의 XCode 는 int 의 최대 값 이다.보아하니 서로 다른 플랫폼 은 다른 것 같다.근 데 windows 는 너무 작 아 요.
이전 평소의 랜 덤 함수:

int littleRand(int min, int max) 
{ 
 //        RAND_MAX     0x7fff,     RAND_MAX*RAND_MAX,  int   
 
 if (min > max) 
 { 
 min = max; 
 } 
 
 int randV = rand() % (max - min + 1); 
 
 int randResult = min + randV; 
 return randResult; 
} 
최적화 하고 싶다:두 개의 상승 을 생각하면 최대 치가 1 억 이 고 모두 랜 덤 이 므 로 균등 해 야 한다.

int bigRand(int min, int max) 
{ 
 //        RAND_MAX     0x7fff,     RAND_MAX*RAND_MAX,  int   
 
 if (min > max) 
 { 
 min = max; 
 } 
 
 int rand1 = rand() % 10000; 
 int rand2 = rand() % 10000; 
 int randV = (rand1 * rand2) % (max - min + 1); 
 
 int randResult = min + randV; 
 return randResult; 
} 
그래서 나 는 100 만 번 을 운행 하여 10 이내 의 무 작위 수 를 생 성하 여 나타 난 횟수 를 집계 했다.

int main() 
{ 
 srand(time(0)); 
 std::map<int, int> a; 
 std::map<int, int> b; 
 for (int i = 0; i < 1000000; i ++) 
 { 
 a[bigRand(1, 10)]++; 
 b[littleRand(1, 10)]++; 
 } 
 for (int i = 1; i <= 10; ++ i) 
 { 
 cout << i <<": \t"<< a[i] << " \t " << b[i] << endl; 
 } 
 
 return 0; 
} 
결과:

왼쪽 은 큰 난수 의 횟수 이 고 오른쪽 은 원래 의 것 이다.
오른쪽 이 비교적 정상 적 이 고 기본적으로 평균 적 이라는 것 을 알 수 있다.
왼쪽 은 분명히 하 나 를 사이 에 두 고 있다.1 만큼 높다.어떻게 생 겼 는 지 나 도 모르겠다.
하지만 범 위 를 좁 히 는 것 은 상상 할 수 있다.랜 덤 으로 1 과 2.
1 과 2 의 확률 은 모두 0.5 이 고 두 개의 수 를 곱 하면 4 이다.우 리 는 1-4 범위 의 무 작위 수 를 얻 을 수 있다.
하지만 확률 은 분명 균등 하지 않다.두 번 실행 하면 1 과 2 가 모두 나타난다.
1:1 번,2:2 번,3:0 번,4:1 번 까지 기다 릴 수 있 습 니 다.
분명히 곱 한 것 은 틀림없이 차이 가 있 을 것 이다.
자,어 렸 을 때 엄마 가 불 렀 던 곱셈 구결 을 다시 한 번 보 세 요.

std::map<int, int> r; 
for(int i = 0; i < 10; ++i) 
{ 
 for (int j = 0; j < 10; ++j) { 
 r[i * j %10]++; 
 } 
} 
for (int i = 0 ; i < 10; ++i) { 
 cout << i <<"\t"<< r[i] << endl; 
} 
결과:

0 27
1 4
2 12
3 4
4 12
5 9
6 12
7 4
8 12
9 4
그럼 어떻게 해 야 되 지?사실은 자 리 를 옮 기 는 방법 을 써 야 지.네가 계산 한 숫자 가 10 진법 이 라면 매번 왼쪽으로 1 을 이동 하면 10 을 곱 하 는 것 이다.예 를 들 어 내 위의 코드 는...

int bigRand(int min, int max) 
{ 
 if (min > max) 
 { 
 min = max; 
 } 
 
 int rand1 = rand() % 10000; 
 int rand2 = rand() % 10000; 
 int randV = (rand1 * 10000 + rand2) % (max - min + 1);//     
 
 int randResult = min + randV; 
 return randResult; 
} 
10000 이하 와 10000 이상 은 전혀 상관 이 없 으 며,두 번 은 무 작위 로 상관 이 없다.오직 이렇게 해야만 정확 한 랜 덤 을 사용 할 수 있다.
사실은 모델 을 구 할 때 모델 이 얼마 인지,첫 번 째 무 작위 로 얼마나 곱 해 야 하 는 지 하 는 것 이다.rand 1 을 곱 한 것 은 rand 2 의 모델 이다.
바 이 두 는 다른 사람의 무 작위 수 를 세 어 보 았 다.

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
unsigned long ulrand(void) { 
 return ( 
 (((unsigned long)rand()<<24)&0xFF000000ul) 
 |(((unsigned long)rand()<<12)&0x00FFF000ul) 
 |(((unsigned long)rand() )&0x00000FFFul)); 
} 
int i; 
unsigned long ul; 
void main() { 
 srand(time(NULL)); 
 for (i=0;i<10;i++) { 
 ul=ulrand(); 
 printf("%010lu 0x%08x
",ul,ul); } }
그리고 이 간단 한 것:

int BigRand() 
{ 
 return RAND_MAX*rand() + rand(); 
} 
사실은 모두 자 리 를 옮 기 는 방식 으로 그 난수 의 최대 치 를 옮 기 면 된다.
그러나 고려 해 야 할 문 제 는 바로 크로스 플랫폼 문제 이다.플랫폼 마다 성형 길이 가 다 를 수 있 습 니 다.RAND맥 스 도 다 를 수 있어.항상 자 리 를 옮 기 면 배열 이 경 계 를 넘 을 수 있 습 니 다.
그 러 니까 안전 을 위해 서
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.

좋은 웹페이지 즐겨찾기