C++
 Computer >> コンピューター >  >> プログラミング >> C++

長さMのパスワードをN個生成するC++プログラムの書き方

本記事では、指定した長さMのパスワードをN個生成するC++プログラムを紹介します。まず rand() 関数を使ってランダムな数字列を生成し、その後、順列(パーミュテーション)アルゴリズムによって、その数字列のすべての並び替えパターンをパスワード候補として出力します。

アルゴリズム

プログラム全体の処理の流れは、以下の擬似コードのとおりです。

開始
  パスワードの長さを入力として受け取る。
  関数 permutation() がランダムなパスワードを生成する。
  /* 引数
    ポインタ配列 a
    乱数の総数 m
    パスワードの長さ s
  */
  // 関数本体:
  if (m == s)
    i = 0 から s-1 まで繰り返す
      *(a + i) を出力する
  else
    i = m から s-1 まで繰り返す
      int tmp = a[m]
      a[m] = a[i]
      a[i] = tmp
      permutation(a, m + 1, s) を再帰呼び出しする
      tmp = a[m]
      a[m] = a[i]
      a[i] = tmp
終了

サンプルコード

#include<iostream>
#include<conio.h>
#include<stdlib.h>
using namespace std;
void permutation(int *a, int m, int s) {
    if (m == s) {
        for (int i = 0; i < s; i++) {
            cout << *(a + i);
        }
        cout << endl;
    } else {
        for (int i = m; i < s; i++) {
            int tmp = a[m];
            a[m] = a[i];
            a[i] = tmp;
            permutation(a, m + 1, s);
            tmp = a[m];
            a[m] = a[i];
            a[i] = tmp;
        }
    }
}
int main(int argc, char **argv) {
    cout << "Enter the length of the password: ";
    int n;
    cin >> n;
    int a[n];
    for (int i = 0; i < n; i++) {
        a[i] = rand() % 10; // 乱数を生成して配列に格納
    }
    cout << "Random Numbers are:" << endl;
    for (int i = 0; i < n; i++) {
        cout << a[i] << endl;
    }
    cout << "The Passwords are: " << endl;
    permutation(a, 0, n);
}

実行結果

Enter the length of the password: 4
Random Numbers are:
1
7
4
0
The Passwords are:
1740
1704
1470
1407
1047
1074
7140
7104
7410
7401
7041
7014
4710
4701
4170
4107
4017
4071
0741
0714
0471
0417
0147
0174

プログラムのポイント

順列の生成方法: permutation() 関数はバックトラッキング(深さ優先探索)の考え方を利用しています。現在の位置 m にある要素と、それ以降の各要素 i を入れ替えながら再帰的に呼び出すことで、すべての並び替えパターンを網羅します。再帰から戻った後にスワップを元に戻すことで、次の分岐処理へ正しく影響を与えないようにしている点が重要です。

乱数の生成: rand() % 10 により、0〜9 の範囲の一桁の乱数を生成して配列に格納しています。英字や記号を含むより実用的なパスワードが必要な場合は、文字セットを用意して rand() の剰余でインデックスを選ぶ方式へ拡張できます。

注意点: 可変長配列 int a[n] は C++ の標準規格では正式にサポートされておらず、GCC などのコンパイラ拡張に依存します。移植性を高めたい場合は std::vector<int> の使用を推奨します。また、実際のセキュリティ用途では予測可能性の低い <random> ヘッダの乱数エンジンを使うことが望ましいでしょう。


  1. C++で乱数を生成するプログラムの書き方【srand・rand関数の使い方を解説】

    C++を使って乱数を生成する方法を解説します。ここでは、0から指定した値までの範囲で乱数を生成します(このプログラムでは最大値を100に設定しています)。 srand()関数とは 乱数を生成するために使用するのがsrand()関数です。この関数はC標準ライブラリに含まれており、void srand(unsigned int seed)として宣言され、rand()関数が使用する乱数生成器にシード(種)を設定する役割を持ちます。 srand()の宣言は以下のとおりです。 void srand(unsigned int seed) この関数は「シード(seed)」と呼ばれる引数を1つ受け取ります。シ

  2. C++のCHAR_BITとは?意味と使い方を解説

    CHAR_BITは、char型が持つビット数を表すマクロです。C++では「limits.h」ヘッダーファイル(C++では<climits>)で宣言されており、一般的な環境では1バイトが8ビットであることを示します。このマクロを利用することで、移植性の高いコードを書くことができます。環境に依存せずにchar型のビット数を取得できるため、ビット演算やデータサイズの計算に役立ちます。CHAR_BITの使用例以下は、C++でCHAR_BITを使用したサンプルコードです。CHAR_BITとsizeofを組み合わせてint型の全ビット数を求め、整数値を2進数形式で出力しています。#includ