Dartを使用して乱数を生成するにはどうすればよいですか?
Dartを使用して乱数を生成するにはどうすればよいですか?
回答:
次の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でテストされています。
/dev/urandom
は、File
クラスで読むほうがよいでしょう。
これは、ライブラリにあるRandom
クラスオブジェクトを介して実現できます。このメソッドには上限が必要です。乱数は始まり、最大制限自体は排他的です。random.nextInt(max)
dart:math
nextInt()
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
安全なランダムAPIが追加されました dart:math
new Random.secure()
dart:math
Random
secure
生成されたすべてのランダムな値について、埋め込みによって提供されたエントロピーソースから読み取る暗号的に安全なランダムジェネレータを返すコンストラクタを追加しました。
window.crypto.getRandomValues()
ブラウザとOS(urandom
サーバー上など)に委任する
このアカウントを作成したばかりなのでコメントできませんが、@ 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
通常の乱数を生成するためにこの小さなクラスを書いただけです...それは私が行う必要があるチェックのまともな出発点でした。(これらのセットは「ベル」型の曲線で分布します。)シードはランダムに設定されますが、セットを再生成できるようにしたい場合は、特定のシードを渡すだけで同じセットが生成されます。
楽しんで...
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
このライブラリhttp://dart.googlecode.com/svn/branches/bleeding_edge/dart/lib/math/random.dartを使用して、sdkに含まれると思われる優れたランダムジェネレーターを提供します
私にとって最も簡単な方法は、
import 'dart:math';
Random rnd = new Random();
r = min + rnd.nextInt(max - min);
//where min and max should be specified.
この質問を、タップすると画面にランダムに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,
),
)
),
画面をタップするたびに新しい乱数が生成され、その番号が参照されて、どのサイコロの顔の画像が選択されるかが選択されます。
この例が役に立てば幸いです:)