【Dart】乱数の生成方法と3つの応用例 | ヒヨコ プログラミング(ヒヨプロ)

【Dart】乱数の生成方法と3つの応用例

Dart

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つの応用例 は終わりです。

コメント

タイトルとURLをコピーしました