반복 되 지 않 는 난수 생 성
문제 설명
[0, n) 범위 내 중복 되 지 않 는 난수 가 발생 합 니 다.
프로젝트 1: Knuth 의 S 프로젝트
한 가지 결론 이 있 습 니 다: r 중간 확률 로 s 개 를 선택 하고, 한 개 를 선택 할 확률 은 s / r 입 니 다. 증명: r 에서 s 개 를 선택 하면 C (r, s) 가 있 고, 그 중에서 C (r, s) 는 조합 을 표시 합 니 다. 같은 이치 로 t 를 선택 하려 면 낳 은 (r - 1) 항목 에서 선택 (s - 1) 항목 을 선택 하고, C (r - 1, s - 1) 상황 이 있 습 니 다. r 항목 에서 s 항목 을 선택 하고, t 가 선택 되 는 확률 은 P = C (r - 1, s - 1) / C 입 니 다.(r, s); 다른 한편 으로 는 배열 조합의 성질 이 있 는데 C (r, s) = r! / (s! * (r - s)!) 는
C(r - 1, s - 1) = (r-1)!/( (s-1)! * (r-s)! ) = s/r * r/s * (r-1)!/( (s-1)! * (r-s)! ) = s/r * r*(r-1)! / ( s*(s-1)! * (r-s)!) = s/r * r!/( s! *(r-s)! ) = s/r * C(r, s)
그러므로 P = s / r
의사 코드
for i = [0, n)
if bigrand()%r < s then
print i
--s;
--r;
예 를 들 어 n = 5, m = 2 는 첫 번 째 원 소 를 선택 할 확률 이 2 / 5 이다. 만약 에 선택 하면 두 번 째 원 소 를 선택 할 확률 이 1 / 4 이다. 그렇지 않 으 면 두 번 째 원 소 를 선택 할 확률 은 2 / 4 이다.
void gen_knuth(int n, int m){
for(int i = 0; i < n; i ++){
if(big_rand()%(n-i) < m){
cout << i;
m--;
}
}
cout<< endl;
}
프로젝트 2: Knuth 교체 방법 P
먼저 하나의 배열 순서 로 [0, n) 의 데 이 터 를 저장 한 다음 에 무 작위 로 두 개의 아래 표 시 된 요 소 를 교환 한 다음 에 최초의 m 개 를 취하 여 m 개의 서로 다른 무 작위 수 를 기억 합 니 다.
for i = [0, n)
x[i] = i;
for i = [0, m)
swap(i, randint(i, n-1))
방안 3: 저수지 방법
저수지 방법 은 n 이 크 거나 n 이 알 수 없 는 상황 을 해결 하 는 데 쓰 인 다. k 를 저수지 용량 으로 보고 n = length (S) 는 사전에 알 수 없 는 집합 S 의 크기 로 본다.
array R[k]; // result
integer i, j; // fill the reservoir array
for each i in 1 to k
do R[i] := S[i] done; // replace elements with gradually decreasing probability
for each i in k+1 to length(S)
do j := random(1, i); // important: inclusive range
if j <= k then
R[j] := S[i]
fi
done
개인 적 인 이 해 는 문서 가 비어 있 지 않 으 면 (최소한 한 줄 이 있 음) 이 줄 을 적 고 문 서 를 다 읽 었 는 지 확인 하 는 것 이다. (while more input lines 에 대응 하 는) 현재 줄 이 k 줄 이면 1 / k 확률 (1 에서 k 줄 을 함께 놓 는 것 과 같은 확률 선택) 로 마지막 선택 결 과 를 k 줄 로 바 꿀 지 여 부 를 결정 하 는 것 이다. 한 번 유추 한 결과 array R [1]저 장 된 [0, n) 의 무 작위
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.