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


126

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


4
それらが悪い数字であることをどうやって知っていますか?ランダムについての事はあなたが本当に言うことができないということです... i46.tinypic.com/2vw7237.gif
corsiKa

2
信頼してください。dart:core Mathを使用している場合は問題があることをご存知でしょう。:)バグは次のとおり
Seth Ladd

3
乱数が悪いかどうか知りたい場合は、ChiSquareライブラリを使用して調べてください:github.com/kaisellgren/ChiSquare
Kai Sellgren

回答:


178

次のRandomクラスを使用dart:math

import 'dart:math';

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

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


1
暗号的に強力な乱数が必要な場合/dev/urandomは、Fileクラスで読むほうがよいでしょう。
タワー

負の乱数(ダブル)はどうですか?私は-0.8〜0.9から例えば生成するrandomRangeメソッドを実装しようとしている...その結果は、例えば、-0.32のためになる
just_a_dude

2
@just_a_dudeは、stackoverflowの完璧な質問のように聞こえます。新しい質問を作成することを検討してください:)
Seth Ladd

1
たとえば-0.8から0.9までを生成するメソッドは簡単です。値をマップするだけです。範囲は0.8 + 0.9 = 1,7です。したがって、rng.nextInt(1700)を指定すると、0〜1700の数値が得られます。100で除算して-0,8を減らします。yourRnd = rng.nextInt(1700)/100.0-0.8を意味します。nextIntを使用するのではなく、倍の0-1、1,7を使用してシフトした-0.8のように使用できるオプションがさらにあります
Veljac

25

これは、ライブラリにあるRandomクラスオブジェクトを介して実現できます。このメソッドには上限が必要です。乱数は始まり、最大制限自体は排他的です。random.nextInt(max)dart:mathnextInt()0

import 'dart:math';
Random random = new Random();
int randomNumber = random.nextInt(100); // from 0 upto 99 included

最小制限を追加する場合は、結果に最小制限を追加します

int randomNumber = random.nextInt(90) + 10; // from 10 upto 99 included

答えには10から109までの数字が含まれていませんか?
ティム

通知してくれてありがとう@Tim前の行からコードをコピーしたところです。解決しました。
Samir Rahimy

17

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

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

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


17

乱数のリストを生成するためのスニペットは次のとおりです

import 'dart:math';

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

これにより、0〜99の12の整数のリストが生成されます。


9

安全なランダムAPIが追加されました dart:math

new Random.secure()

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

window.crypto.getRandomValues()ブラウザとOS(urandomサーバー上など)に委任する


この新しいAPIは、1.14-dev以降で使用できます。
Seth Ladd、2015年

7

このアカウントを作成したばかりなのでコメントできませんが、@ eggrobot78のソリューションが機能することを確認したかったのですが、これはdart専用であり、最後の番号は含まれていません。最後の行を「r = min + rnd.nextInt(max-min + 1);」に変更すると、最後の行も含まれるはずです。

説明:

max = 5;
min = 3;
Random rnd = new Random();
r = min + rnd.nextInt(max - min);
//max - min is 2
//nextInt is exclusive so nextInt will return 0 through 1
//3 is added so the line will give a number between 3 and 4
//if you add the "+ 1" then it will return a number between 3 and 5

4

これを試して、あなたは最小/最大値を制御することができます:

import 'dart:math';

void main(){
  random(min, max){
    var rn = new Random();
    return min + rn.nextInt(max - min);
  }
  print(random(5,20)); // Output : 19, 6, 15..
}

3

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


以前にDRandomを使用したことがあります。いいlib!
ジョンエヴァンス

3

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

楽しんで...

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個の数値のセットの平均を確認できます。値はクラスに格納されるため、インスタンス化後にそれらにアクセスできます。

_swarmii



1

私にとって最も簡単な方法は、

import 'dart:math';
Random rnd = new Random();
r = min + rnd.nextInt(max - min);
//where min and max should be specified.

ここで @ adam-singerの説明に感謝します。


1

それは私のために働いた new Random().nextInt(100); // MAX = number

それは0から99の乱数を与えます

例::

import 'dart:math';
int MAX = 100;
print(new Random().nextInt(MAX));`

0

この質問を、タップすると画面にランダムに6つのサイコロの顔の画像の1つを呼び出す単純なサイコロ回転アプリの形の実用的な例で解決しましょう。

最初に、乱数を生成する変数を宣言します(dart.mathのインポートを忘れないでください)。次に、1〜6の制約内で初期乱数を解析する変数を整数として宣言します。

どちらの変数も、一度初期化するために静的プライベートです。これは大したことではありませんが、一連の乱数全体を初期化する必要がある場合は、良い方法です。

static var _random = new Random();
static var _diceface = _rnd.nextInt(6) +1 ;

次に、ClipRRectを子としてジェスチャー検出ウィジェットを作成し、タップすると6つのサイコロの顔の画像の1つを画面に返します。

GestureDetector(
          onTap: () {
            setState(() {
              _diceface = _rnd.nextInt(6) +1 ;
            });
          },
          child: ClipRRect(
            clipBehavior: Clip.hardEdge,
            borderRadius: BorderRadius.circular(100.8),
              child: Image(
                image: AssetImage('images/diceface$_diceface.png'),
                fit: BoxFit.cover,
              ),
          )
        ),

画面をタップするたびに新しい乱数が生成され、その番号が参照されて、どのサイコロの顔の画像が選択されるかが選択されます。

この例が役に立てば幸いです:)

Dartで乱数を使用するサイコロ回転アプリ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.