문자열 HHHHHHTTTTTT
의 발생 횟수를 1 백만 플립으로 계산하려고합니다. 코인 플립의 경우 간단한 std :: rand() % 2를 사용하고 있습니다. 아래 코드를 참조하십시오. I는 확률 교과서에서이 결과를 가지고/2^12 = 244C + +에서 동전 던지기 실험 std :: rand()를 사용하여 잘못된 결과를 내기
- 수학적으로 예상되는 응답은
(12 + 1 10^6)이다. 하지만 내 코드는 그 반 정도, 즉 약 122 정도만 일관되게 발생합니다.이 문제는 std :: rand()를 동전 뒤집기 알고리즘으로 사용하거나 내 코드에 버그가 있습니까?
#include <iostream>
#include <cstdlib>
#include <vector>
#include <ctime>
using std::vector;
bool coin_flip(){
return std::rand() % 2;
}
int count_string(int n, const vector<bool>& s){
int k=0, res=0;
for(int i=0; i<n; i++){
if(coin_flip()==s[k]){
k++;
if(k==s.size()){
res++;
k=0;
}
}else{
k=0;
}
}
return res;
}
int main(){
std::srand(std::time(0));
vector<bool> v(12);
const int a[12] = {1,1,1,1,1,1,0,0,0,0,0,0};
for(int i=0; i<12; i++){
v[i] = a[i];
}
std::cout << count_string(1000000, v) << '\n';
return 0;
}
'count_string'을 단위 테스트하십시오. 즉, 수정 된'coun_flip'에서'HHHHHHHTTTTTT'라는 시퀀스를 생성하십시오. 왜 대답이 '1'일 때'0'을 얻을 수 있습니까? (시작 부분에 추가로 'H'가 있음) – BeyelerStudios
맞습니다. 검색 알고리즘이 깨졌습니다. 'std :: rand'에는 아무런 문제가 없습니다. 임의의 예상 결과에 대해이 작업을 올바르게 수행하려면 올바른 검색 방법으로 검색 문자열에서 [NFA] (https://en.wikipedia.org/wiki/Nondeterministic_finite_automaton)를 작성한 다음 [DFA] (https://en.wikipedia.org/wiki/Deterministic_finite_automaton) 무작위로 생성 된 입력을 사용하여 DFA를 실행 한 다음 종료 상태에 도달했는지 확인하십시오. –
완성을위한 순진한 접근 방법 : 코인 플립을 저장하는 검색 문자열 크기의 원형 버퍼를 사용하십시오. – BeyelerStudios