ボゴソートもどきの文字列作成

投稿者: | 2018年4月17日

「文字列をランダムで作ってPPAPになるコードでよくわからないエラーでるんだけど」と言われて、
エラー云々はよくわからなかったので、自分でそういうコードを書いてみました。

[cpp]
  #include <iostream>
  #include <time.h>
  #include <string>
  #include <random>
  #include <chrono>
  using namespace std;
  int dice(void);
  int main(int argc, char const *argv[]) {
    //A~Zのアルファベットの配列を作成
    char moji[26];
    int j=0;
    for(char i='A';i<='Z';i++){
      moji[j]=i;
      j++;
    }
    auto  start=chrono::system_clock::now();   //時間計測
    string s;
    int count=0;  //最悪∞回ループが回るので規定回数回ったら終了させたい用
    while(count<1000000){
      for(int i=0;i<4;i++){
        int j=dice();
        s.push_back(moji[j]);
      }
      if(s=="PPAP"){
        printf("%d回目にPPAPになりました。\n",count+1);
        break;
      }
      count++;
      s.clear();
    }
    if(count==1000000) cout<<"PPAPにはなりませんでした。"<<endl;
    //時間計測
    auto end=chrono::system_clock::now();
    auto dur=end-start;
    auto second=chrono::duration_cast<std::chrono::seconds>(dur).count();
    cout<<second<<endl;
    return 0;
  }
  //乱数発生関数
  int dice(void){
    random_device rnd;
    mt19937 mt(rnd());
    uniform_int_distribution<int> rand26(0,25);
    return rand26(mt);
  }
  [/cpp]

実行にかかる時間を測るためにchrono使っています。C++11で増えた機能全然知らなくてやばい。
[blogcard url=”https://cpprefjp.github.io/reference/chrono.html”]
アルファベットの配列を先に作ってます。もう少し綺麗に書けないかなあと。ただ、

[cpp]
  char moji[26]={'A','B',・・・,'Z'};
[/cpp]

って書くよりかはマシな気がします。まあ、先に作っておいて、コピペでいいけども。素数とかはそっちの方が早いですし。

実行時間は大体30秒程度でした。まあやってる話がボゴソートですし。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください