3

私はしばらくの間疑問に思っていました。シード中に数値をランダムにする良い (そして高速な) 方法はありますか? 1 つの数値を一見乱数に変換する優れたアルゴリズムはありますか?

ちょっとした例:

specialrand(1) = 8
specialrand(2) = 5
specialrand(3) = 2
specialrand(4) = 5
specialrand(5) = 1
specialrand(1) = 8
specialrand(4) = 5
specialrand(1) = 8

出力も巨大な数になることができれば、とてもいいでしょう。

注:プログラムを再起動するたびに同じ出力が必要なため、配列に大きな違いを与えることができるようにしたいので、配列を埋めて数字をランダム化したくありません

4

4 に答える 4

6

シードされた乱数を探しているわけではありません。代わりに、あなたが探していると思うのはハッシュ関数です。同じ入力を入れて同じ出力を得た場合、それはランダムではありません。

実行のために乱数のシーケンスを生成しようとしているが、実行ごとに同じシーケンスを生成する場合は、同じシード値を指定して同じシーケンスを生成する乱数ジェネレーターを使用できます。

これが最も基本的な pRNG の仕組みです。より暗号的に安全な RNG がありますが、標準の Math.rand() はニーズを満たすために機能するはずです。

于 2012-03-15T20:13:01.853 に答える
0

日付機能を使用できます

Math.valueOfSeed = function(n)
    {
        return Number(new Date(n%9999, n%12, n%30, n%24, n%60, n%60, n%1000));
    };

alert(Math.valueOfSeed(1) + " = " + Math.valueOfSeed(1));
alert(Math.valueOfSeed(2) + " = " + Math.valueOfSeed(2));
alert(Math.valueOfSeed(15) + " = " + Math.valueOfSeed(15));
alert(Math.valueOfSeed(5555) + " = " + Math.valueOfSeed(5555));
alert(Math.valueOfSeed(21212121) + " = " + Math.valueOfSeed(21212121));
alert(Math.valueOfSeed(6554654654) + " = " + Math.valueOfSeed(6554654654));​ 

テストはこちら

于 2012-03-15T20:29:41.880 に答える
0

おそらく、疑似乱数ジェネレーターが探しているものです。

たとえば、XORshift

uint32_t xor128(void) {
   static uint32_t x = 123456789;
   static uint32_t y = 362436069;
   static uint32_t z = 521288629;
   static uint32_t w = 88675123;
   uint32_t t;

   t = x ^ (x << 11);
   x = y; y = z; z = w;
   return w = w ^ (w >> 19) ^ (t ^ (t >> 8));
}

次のようなものを作成できます。

  • 種を取る
  • specialrand(5) は、このシードから 5 番目の乱数を取得する関数です。
  • または specialrand(5) は、シードから最初の乱数を取得する関数です+5

多分これはあなたの目的には十分です。

于 2012-03-15T20:06:52.383 に答える
0

キーまたはキーのセットを設定してから、そのキーに基づいて新しい数値を返す方程式を使用して関数を記述してみてください。

非常に基本的な例は次のとおりです。

function specialrand(value) {
key = array (1,2,4,6,8);
  for (k in key) {
      if (k%2 === 0) {
      value -= key[k] * value;
      } else {
      value += key[k] / value;
      }
  }
 return value;
}

ただし、非常に複雑な方程式を作成して「乱数」を生成し、毎回同じ数を返すようにすることもできます。

于 2012-03-15T20:20:01.680 に答える