Dart で乱数を生成する方法を紹介します。また、乱数の応用例として、指定の範囲でランダムに整数を生成する方法や、指定の桁数の整数をランダムに生成する方法、ランダムな文字列の作成方法も紹介します。
乱数の生成方法
math ライブラリの Random クラスを使用して、乱数を生成することができます。生成できる乱数は、bool、double、int の3種類です。math ライブラリは、忘れずにインポートしておきましょう。
nextBool()
true か false のどちらかをランダムに生成します。
import 'dart:math' as math;
main() {
for (var i = 0; i < 5; i++) {
var random = math.Random();
print(random.nextBool());
}
}
実行結果の例
false
false
true
true
true
nextDouble()
0.0以上1.0未満の実数をランダムに生成します。
import 'dart:math' as math;
main() {
for (var i = 0; i < 5; i++) {
var random = math.Random();
print(random.nextDouble());
}
}
実行結果の例
0.5859683664987677
0.8656401664799194
0.3029041760778268
0.6043042004783964
0.3354189790996014
nextInt(int max)
0以上 max 未満の範囲で、整数をランダムに生成します。例えば、nextInt(10)とした場合は、0〜9の整数がランダムに作られます。
import 'dart:math' as math;
main() {
for (var i = 0; i < 5; i++) {
var random = math.Random();
print(random.nextInt(10));
}
}
実行結果の例
6
1
6
9
2
指定の範囲で整数をランダム生成
nextInt(int max) は、ランダム生成できる整数の範囲の最小値が0と決まっています。そこで、ここでは最小値を変更できるようにして、範囲を自由に指定できるようにする方法を紹介します。
ソースコード
以下ソースコードの、randomIntWithRange(int min, int max) が指定した範囲でランダムに整数を生成する処理です。この関数で生成される整数の範囲は、min 以上 max 未満です。
import 'dart:math' as math;
main() {
for (var i = 0; i < 5; i++) {
print(randomIntWithRange(100, 110));
}
}
int randomIntWithRange(int min, int max) {
int value = math.Random().nextInt(max - min);
return value + min;
}
実行結果の例
102
109
105
100
103
解説
まず最大値 max から最小値 min を引いて、範囲にある整数の個数を求めます。そして、その個数を引数にして nextInt() を実行しています。(ソースコード10行目)
int value = math.Random().nextInt(max - min);
例えば、100以上110未満の範囲で考えると、範囲内の整数の個数が10なので、0~9の中から乱数生成します。
最後に、nextInt()で生成された乱数に、最小値 min を足すことで、min 以上 max 未満の範囲にしています。(ソースコード11行目)
return value + min;
例えば、nextInt()で生成された乱数が3の場合、範囲の最小値100を足して103となります。
指定の桁数で整数をランダム生成
次に、指定の桁数で整数をランダム生成する方法を紹介します。
ソースコード
randomIntWithDigit(int digit) が、引数 digit で指定された桁数の整数をランダム生成する処理です。
import 'dart:math' as math;
main() {
print(randomIntWithDigit(1));
print(randomIntWithDigit(3));
print(randomIntWithDigit(5));
print(randomIntWithDigit(8));
print(randomIntWithDigit(9));
}
int randomIntWithRange(int min, int max) {
int value = math.Random().nextInt(max - min);
return value + min;
}
int randomIntWithDigit(int digit) {
if (digit <= 0 || digit >= 10) {
return -1;
}
int max = math.pow(10, digit).toInt();
int min = digit == 1 ? 0 : max ~/ 10;
int value = randomIntWithRange(min, max);
return value;
}
実行結果の例
0
842
22044
42672852
142859952
解説
randomIntWithDigit(int digit) の最初の if 文では、桁数のチェックを行なっています。今回対応している桁数は、int の上限値も踏まえて1〜9桁です。それ以外の桁数が指定されていた場合は、-1 を返します。
if (digit <= 0 || digit >= 10) {
return -1;
}
次に、指定した桁数になる範囲を求めています。最大値は、10の 桁数 乗で算出します。最小値は、指定された桁数が1の場合は0、それ以外は、最大値を10で割って算出しています。(ソースコード21、22行目)
int max = math.pow(10, digit).toInt();
int min = digit == 1 ? 0 : max ~/ 10;
例えば、3桁の整数を生成したい場合は、
max = 10の3乗 = 1000、min = max/10 = 100 となります。
100以上1000未満の整数は、3桁になりますよね。
範囲がわかれば、その範囲で指定してランダムに整数を生成すれば良いです。(ソースコード23行目)
int value = randomIntWithRange(min, max);
ランダムな文字列を生成
最後に、乱数を使ってランダムな文字列を作る方法を紹介します。
ソースコード
以下のソースコードの randomString(int length) がランダムな文字列を生成する処理になっています。引数の length でランダム生成する文字列の長さを変えることができます。
import 'dart:math' as math;
main() {
print(randomString(3));
print(randomString(5));
print(randomString(8));
print(randomString(10));
print(randomString(20));
}
String randomString(int length) {
String randomStr = "";
var random = math.Random();
for (var i = 0; i < length; i++) {
int alphaNum = 65 + random.nextInt(26);
int isLower = random.nextBool() ? 32 : 0;
randomStr += String.fromCharCode(alphaNum + isLower);
}
return randomStr;
}
実行結果の例
YPu
oXoCH
zqMXlCGh
aADHjUdpqU
LdZuhOQkueKQvKKLmVAr
解説
アルファベットは、ASCIIコードで数値が割り当てられています。大文字 A〜Z が 65〜90、小文字 a〜z が 97〜122 となっています。よって、大文字の数値に、32 を足すと小文字の数値に変換することもできます。例えば、65(A)+32=97(a) となります。これらの数字を利用してランダムな文字列を作成しています。
まず、以下の処理(ソースコード17行目)では、A〜Z を表す 65〜90 の中からランダムに決めています。
int alphaNum = 65 + random.nextInt(26);
次に、以下の処理(ソースコード18行目)では、大文字にするか小文字にするかを、bool の乱数でランダムに決めています。nextBool() が ture の場合は、小文字に変換するため、isLower の値を 32 にします。
int isLower = random.nextBool() ? 32 : 0;
最後に、現在の文字列にランダムに決まった文字を連結しています。(ソースコード20行目)
alphaNum + isLower で、isLower が 32 の場合は小文字の数値に変換しています。また、fromCharCode()で、数値を文字に戻しています。
randomStr += String.fromCharCode(alphaNum + isLower);
以上の処理を文字列の長さ分、繰り返すことで文字列を生成しています。
まとめ
Dart で乱数を生成する方法と、乱数を使った応用例を3つ紹介しました!
math クラスの Random クラスで、乱数を生成できます。
- bool の乱数 → nextBool()
- double の乱数 → nextDouble()
- int の乱数 → nextInt(int max)
以上で、【Dart】乱数の生成方法と3つの応用例 は終わりです。
コメント