0〜9とaz / AZを使用して長さがx文字のランダムな文字列を作成しようとしていますが、良い例が見つからないようです。アイデアはありますか?
8 に答える
Function RandomString(cb As Integer) As String
Randomize
Dim rgch As String
rgch = "abcdefghijklmnopqrstuvwxyz"
rgch = rgch & UCase(rgch) & "0123456789"
Dim i As Long
For i = 1 To cb
RandomString = RandomString & Mid$(rgch, Int(Rnd() * Len(rgch) + 1), 1)
Next
End Function
組み込みの乱数ジェネレーターは暗号的に安全ではないため、このような関数を使用してパスワードを生成しないでください。
私はすべてのVB6を忘れました(神に感謝します)が、擬似コードではそれはかなり簡単です:
all_chars=すべての有効な文字の配列 シード乱数ジェネレーター for i = 1 to x do random_index=1からall_charsの長さまでの乱数を取得します 'VB6で連結してコメントする方法を覚えています:-) string = string&all_chars [random_index] のために終わる 終わり!
したがって、配列を作成して文字で埋める方法、配列の長さを取得する方法、および配列の最初と最後のインデックスの間の乱数を取得する方法を見つけるだけです。
もちろん、それとループです。
Joel の方法は問題ありません (整数ループ変数と、連結に「+」を使用することを除く)。(-:
ただし、いくつかの方法で出力をより興味深いものにすることができます。
まず、Zz 文字よりも多くの Ee および Tt 文字を含むシード文字列を作成することにより、一般的な英語のテキストと同じおおよその頻度分布を持つ文字列を生成できます。このおおよその組み合わせで、おそらく 1000 文字 (大文字と小文字が混在する場合はその 2 倍) の文字列は問題なく機能します。
最終出力で見たい比率で 0..9 文字の同数を追加します。この参照文字列をシャッフルして、よりランダムに見えるようにすることもできますが、実際には問題ではありません。
次に、Joel の例と同様に、1..Len(seedstring) の範囲のランダム セレクターを使用して各文字を選択します。
なぜこれを行うのですか?結果がより見慣れたものになることを除けば、正当な理由はありません。
2 番目のオプションは、そのような 2 つのシード文字列を生成することです。1 つはコーパスの重みの子音で、もう 1 つは同じ重みの母音 (U よりも O よりも E の方が多いなど) です。大文字と小文字が混在するのではなく、1 つのケースのみを使用します。
次に、最初に子音から、次に母音から、2 つのランダムな選択を交互に行い、TI、WO、DE などの有向グラフを生成します。これらをつなぎ合わせて「ことば」をつくります。
結果の出力は発音可能であるため、はるかに簡単に覚えることができます。さらに、それは不気味な日本人に見えます。(-:
私たちのスタミナライブラリ (VB/VBA 用の ASM 関数) には、これらのことを行うルーチンがありますが、純粋な VB では十分に簡単です。
この質問に触発されて、GUID を使用してシーケンスを生成することを提案する同様の質問をしました。私が指摘するように、これの短所は、私の論理に他に欠陥がなければ、A から F と 10 桁のランダムなシーケンスになるということです。G から Z までの文字が欠落しているという事実に耐えることができる場合は、これが解決策になる可能性があります。
SQL データベースを使用している場合は、次のように PrimaryKey を生成できます。
SELECT NEWID() as KeyValue
これは非常に良い方法であり、非常に安全でもあります。
Vinko Vrsalovic のアルゴリズムを使用した関数コードは次のとおりです。
all_chars = array("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","S","T","U","V","W","X","Y","Z")
Randomize
for i = 1 to 4
random_index = int(Rnd()*25)
clave = clave & all_chars(random_index)
next
これを何に使っているのか、あなたは本当に言いませんでした。小さな文字列 (<=32,766) が必要な場合は、Joel の関数がうまく機能すると思います。ただし、非常に大きな文字列を生成する必要がある場合は、これが役立つ場合があります。私のシステムでは、1,000,000 文字の文字列を 0.33291015625 秒で処理します (はい、知っています... 大ハンマー :)) また、文字セットをパラメータ化できるため、何か「特別な処理を行うたびにコードを変更する必要はありません」 ":):
Public Function RandomString( _
ByVal length As Long, _
Optional charset As String = "abcdefghijklmnopqrstuvwxyz0123456789" _
) As String
Dim chars() As Byte, value() As Byte, chrUprBnd As Long, i As Long
If length > 0& Then
Randomize
chars = charset
chrUprBnd = Len(charset) - 1&
length = (length * 2&) - 1&
ReDim value(length) As Byte
For i = 0& To length Step 2&
value(i) = chars(CLng(chrUprBnd * Rnd) * 2&)
Next
End If
RandomString = value
End Function
Randomize
Int(Rnd * high bound) + (low bound) を使用すると、乱数が生成さ
れます asc("a") から asc("z") および asc("0") から asc(" までの値を持つ配列を生成します9")
1 から 26 (10+26) までの乱数を生成し、配列で検索します。
もうVB6をインストールしないでください。