C++의 큰 난수 에 관 한 문 제 를 간단히 이야기 하 다.
다 들 아시 다시 피 C++의 난수 최대 치 는 RAND 입 니 다.MAX,헤더 파일
이전 평소의 랜 덤 함수:
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맥 스 도 다 를 수 있어.항상 자 리 를 옮 기 면 배열 이 경 계 를 넘 을 수 있 습 니 다.
그 러 니까 안전 을 위해 서
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
hdu 1717 소수 화 점수 2 (수학)소수 화 점수 2 레이 는 수학 시간 에 선생님 의 말씀 을 듣 고 모든 소수 가 점수 로 표시 되 는 형식 이 라 고 말 했다. 그 는 녹 기 시 작 했 고 곧 완성 되 었 다. 그러나 그 는 또 하나의 문 제 를...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.