Random()の挙動に関して

現在困っていることが起こっています。
ランダムで8文字程度の英数字パスワード処理を作成したく、
見よう見まねで8つの変数を作成し、どれも変数の中身は配列でa~Zと0~9の文字配列を持っています。

毎回インスタンスをnewで作成し(計8回)、random()でランダムな数値を取得しているのですが、すべて同じ数値になってしまいます。

ただ、不思議な事にステップ実行し、ひとつひとつ処理を見ていくと今度は毎回違う数値がランダムで選択され、期待する挙動になります・・・。

何がいけないのでしょうか・・・。

通常実行と、パブリッシュ後のロボットでの実行だとパスワード生成がうまくいきません・・・泣

何かご存じの方どうかご教示くださいませ。

乱数発生には、乱数の起点となる値(シード値)が必要で、もしこれが指定されていなければお困りのように同じ値が出現してきます。

こちらをご覧になって、適用してみてください

シード値なるものがあるのですね、
random(1)とrandom(2)で返し値が変わるのですね・・・!
初めて知りました。ありがとうございます!

ただ、シード値もランダムで取得しなければ毎回固定だときまったものしかでませんね・・・
ここはアルゴリズムを考えないといけなさそうですかね・・・

シード値は現時刻の秒数を使用すると分散した結果を得やすいです。

1秒間に何個も出力しないのであれば問題ないかと思います :wink:

1 Like

nowから、時からミリ秒まで取れますので、それを利用するのですよ。

こんにちは

今回のケースは、後続の処理内容にもよりますが、Randomクラスのインスタンスを8つ生成する必要性の有無を検討した方が良いように思えます。

引数無しでRandomクラスのインスタンスを生成すると、システム起動からの積算時間がシードとして使用されますので、連続して8つのインスタンスを生成すると、同じシードとなり、同じ乱数系列となります。またステップ実行で異なる乱数となるのは、ステップ実行により各インスタンス生成のタイミングがずれることにより、異なるシードを使うことになるため、結果として異なる乱数系列となります。

シードを個別に8つ生成しても良いかと思いますが、ある程度のランダムさが確保できるので良いのであれば、Randomクラスを一つだけ生成して、そこからすべての乱数を取るようにすれば、このような問題は回避できるかと思います。(引数無しでも積算時刻を推定することが困難であれば、ほぼ安全と考えられますし、こちらに不安があるなら自前で引数を検討しても良いかと思います。)

1 Like