web-dev-qa-db-ja.com

Dartで乱数を生成するにはどうすればよいですか?

Dartを使用して乱数を生成するにはどうすればよいですか?

69
Seth Ladd

Random class from Dart:math

import 'Dart:math';

main() {
  var rng = new Random();
  for (var i = 0; i < 10; i++) {
    print(rng.nextInt(100));
  }
}

このコードは、この記事の執筆時点で、Dart VMおよびDart2jsでテストされています。

93
Seth Ladd

cryptographically-secure乱数(暗号化など)が必要で、ブラウザを使用している場合は、 DOM暗号を使用できますAPI

int random() {
  final ary = new Int32Array(1);
  window.crypto.getRandomValues(ary);
  return ary[0];
}

これはDartium、Chrome、Firefoxで動作しますが、これは実験的なAPIであるため、他のブラウザでは動作しない可能性があります。

13
Sam McCall

これが乱数のリストを生成するためのスニペットです

import 'Dart:math';

main() {
  var rng = new Random();
  var l = new List.generate(12, (_) => rng.nextInt(100));
}

これにより、0から99(両端を含む)の12個の整数のリストが生成されます。

10
Mark E. Haase

安全なランダムAPIが_Dart:math_に追加されました

_new Random.secure()
_

_Dart:math_ Randomは、すべての生成されたランダム値に対して埋め込みによって提供されるエントロピーソースから読み取る暗号的に安全なランダムジェネレーターを返すsecureコンストラクターを追加しました。

ブラウザのwindow.crypto.getRandomValues()およびOSに委任します(サーバーのurandomなど)

6

別の解決策は、次のコードを使用することです DRandom 。このクラスはシードとともに使用する必要があります。これは、.NETで期待するものに馴染みのあるインターフェイスを提供し、monoのRandom.csから移植されました。このコードは暗号化に対して安全ではない可能性があり、統計的にテストされていません。

3
adam-singer

Normal乱数を生成するためにこの小さなクラスを作成しました...これは、私が行う必要のあるチェックのきちんとした出発点でした。 (これらのセットは「ベル」型の曲線で分布します。)シードはランダムに設定されますが、セットを再生成したい場合は、特定のシードを渡すだけで同じセットが生成されます。

楽しむ...

class RandomNormal {
  num     _min, _max,  _sum;
  int     _nEle, _seed, _hLim;
  Random  _random;
  List    _rNAr;

  //getter
  List get randomNumberAr => _rNAr;

  num _randomN() {
    int r0 = _random.nextInt(_hLim);
    int r1 = _random.nextInt(_hLim);
    int r2 = _random.nextInt(_hLim);
    int r3 = _random.nextInt(_hLim);

    num rslt = _min + (r0 + r1 + r2 + r3) / 4000.0;  //Add the OS back in...
    _sum += rslt; //#DEBUG ONLY
    return( rslt );
  }

  RandomNormal(this._nEle, this._min, this._max, [this._seed = null]) {
    if (_seed == null ) {
      Random r = new Random();
      _seed    = r.nextInt(1000);
    }
    _hLim   = (_max - _min).ceil() * 1000;
    _random = new Random(_seed);
    _rNAr   = [];
    _sum    = 0;//#DEBUG ONLY

    h2("RandomNormal with k: ${_nEle}, Seed: ${_seed}, Min: ${_min}, Max: ${_max}");//#DEBUG ONLY
    for(int n = 0; n < _nEle; n++ ){
      num randomN = _randomN();
      //p("randomN  = ${randomN}");
      LIST_add( _rNAr, randomN );
    }

    h3("Mean = ${_sum/_nEle}");//#DEBUG ONLY
  }
}


new RandomNormal(1000, 80, 120);
new RandomNormal(1000, 80, 120);
new RandomNormal(1000, 80, 120);
new RandomNormal(1000, 80, 120);
new RandomNormal(1000, 80, 120);
new RandomNormal(1000, 80, 120);
new RandomNormal(1000, 80, 120);

次に、このように使用して、下限と上限の間で生成された1000 numのセットの平均を確認できます。値はクラスに格納されるため、インスタンス化後にアクセスできます。

_swarmii

2
george koller

このライブラリを使用してください http://Dart.googlecode.com/svn/branches/bleeding_Edge/Dart/lib/math/random.Dart は良いランダムを提供しましたSDKに含まれるジェネレーターはすぐに役立つと思います

1
kaiser avm