0

次のようなパターンに基づいて乱数を生成したい:

random.int= pattern="[0-9]{%len%}"   
random.big_integer= pattern="[0-9]{%len%}"  
random.long= pattern="[0-9]{%len%}"   
random.string= pattern="[A-Z][a-z]{0,%len%}"  
random.char= pattern="[A-Z]{1}"  
random.byte= pattern="[A-Z][0-9]{1}"  
random.short= pattern="[0-9]{%len%}"  
random.float= pattern="[0-9]{%len%}\\.[0-9]{%scl%}"  
random.double= pattern="[0-9]{%len%}\\.[0-9]{%scl%}"  
random.big_decimal= pattern="[0-9]{%len%}\\.[0-9]{%scl%}"  

したがって、私の入力は「len」、「scl」、およびデータ型になります。これらの入力に基づいて、対応するパターンを読み取り、出力を生成する必要があります。この出力は、1 回の実行中の呼び出しごとにランダムである必要があります。プログラムを再実行しても、出力は同じはずです。

JAVAでこれを達成するために私が取ることができる最善のアプローチは何ですか?

たとえば、generateRandomOutput("float",5,2) [datatype,length,scale] を呼び出した場合、出力には 21453.67 のようなランダムな浮動小数点数が含まれている必要があります (これは、上記のパターン "random.float" に基づいています)。 )

4

5 に答える 5

1

簡単に言えば、ベースの変更です。a を取得しMath.randomて 26 を掛けることで、ランダムな文字を生成できます。結果は、alphabet( [A-Z]) 内のランダムな文字の位置を示します。

2 つのランダムな文字を含む文字列を取得するには、26^2 を掛けて、数値を基数 26 に変更する必要があります (または、乱数に 26 を 2 回掛けたものを取得します)。

于 2012-10-14T18:43:29.880 に答える
1

クイックチェックを試す

優れたプリミティブ ジェネレーターを提供します。

于 2012-10-14T19:13:26.760 に答える
0

プログラムを再実行した場合、出力は同じになるはずです。

あなたが実際にそれをランダムにしたいように聞こえませんか?

MD5、SHAなどのような一方向のハッシュ関数を見てください。

于 2012-10-14T19:53:24.263 に答える
0

正規表現に準拠する可能性のあるすべての文字列を特定することはできません。あなたが持っているような単純な正規表現のみです。そのため、あなたを助けるライブラリがあるとは思えません。

A=> AZ、a=> az、d=> 0-9、nnn を繰り返しとして、その他の文字をそれ自体として使用するなど、独自のより単純な形式を使用することをお勧めします。

の代わりに ef

random.byte= pattern="[A-Z][0-9]{1}" 

してただろう

random.byte.pattern=Ad

これは、解析がはるかに簡単です。

于 2012-10-14T19:46:15.920 に答える
0

まず、「シード」できる乱数ジェネレーターが必要です。これにより、実行ごとに同じシードを提供して、実行を再現できるようにすることができます。java.util.Random をシードできます。

次に、与えられた長さとアルファベットから、その数のランダムな文字列を提供する標準ルーチンを作成することをお勧めします。次に、データ型ごとに共通ルーチンを呼び出して文字列を取得し、目的の型に変換するルーチンを記述します。

標準ルーチンは非常に単純です。

  • 長さとアルファベットのパラメーターを受け取ります。

  • RNG から次の乱数を取得します。

  • ランダムな整数を取り、アルファベットの長さのモジュラスを計算します。

  • モジュラスを使用して、アルファベットから次の文字を選択します。それを結果の文字列に押し込みます。

  • 指定された文字数が蓄積されるまで繰り返します。

型固有のルーチンでは、上記の共通関数を適切なパラメーター (float/double/big decimal の場合は "." を挿入して 2 回) で呼び出してから、Datatype.getDatatype (適切なデータ型名に置き換えます) を使用して、結果の文字列を適切な型に変換します。したがって、タイプ固有のルーチンはほとんどが「ボイラープレート」です。

共通ルーチンに渡される「アルファベット」は、数値型の場合は「0123456789」、「char」型の場合は「ABCD..WXYZ」、「バイト」型の場合は「ABCD..WXYZ0123..789」です(または意図した「0123456789ABCDEF」になるのですか?)。

于 2012-10-14T19:15:39.647 に答える