🃏

Listを操作する

2023/06/02に公開

乱数を使ってロジックを作ってみる

DartのListを使うときに、ランダムな数値を±10して、基準となる数値が、120なら110~130の間のロジックを作る機会があったので、ビジネスロジックを作ってみた。
そのままのリストで作ると、値が重複することがあるので、Setを使って防止した。時々同じ値が出てくることがあったような?
面白いプログラムなので、記事にしようと思いました。while文もあまり使う機会ないので、珍しいなと思った。

import 'dart:math';

void main() {
  // メソッドを呼び出す
  bpmList();
}
// このメソッドは、120 ± 10 の範囲でランダムな bpm のリストを生成する
Future<void> bpmList() async {
  // 基準となる bpm を定義する
  double baseBpm = 120.0;
  // 重複を許さない Set を使う
  Set<double> generatedBpmSet = {};
  // 3 つの要素が生成されるまで繰り返す
  while (generatedBpmSet.length < 3) {
    // 120 ± 10 の範囲でランダムな bpm を生成する
    double randomBpm = baseBpm + Random().nextInt(21) - 10;
    // 生成した bpm を Set に追加する
    generatedBpmSet.add(randomBpm);
  }
  // Set を List に変換する
  List<double> generatedBpmList = generatedBpmSet.toList();
  // List をシャッフルする
  generatedBpmList.shuffle();
  // 先頭に baseBpm を追加する
  generatedBpmList.insert(0, baseBpm);

  print(generatedBpmList);// [120.0, 118.0, 126.0, 111.0]
}

こちらにListについてのメソッドが紹介されているリンクを貼っておきます。
どんな時にこのようなプログラムを使ったかというと、ボタンをランダムに生成したいロジックを作るときに使いました。
https://dart.dev/language/collections

ボタンを作るときは、こんな感じのコードを書きます。参考までにどうぞ

import 'package:flutter/material.dart';
import 'dart:math';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Elevated Button Example'),
        ),
        body: Center(
          child: Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: generateElevatedButtons(),
          ),
        ),
      ),
    );
  }

  // ランダムなBPMのボタンを生成する関数
  List<Widget> generateElevatedButtons() {
    double baseBpm = 120.0;
    Set<double> generatedBpmSet = {};
    // 3つのボタンを生成するまで繰り返す
    while (generatedBpmSet.length < 3) {
      double randomBpm = baseBpm + Random().nextInt(21) - 10;
      generatedBpmSet.add(randomBpm);
    }
    // SetをListに変換してシャッフル
    List<double> generatedBpmList = generatedBpmSet.toList();
    generatedBpmList.shuffle();
    generatedBpmList.insert(0, baseBpm);
    // ボタンを生成
    List<Widget> buttons = [];
    // ボタンの数だけ繰り返し。Widgetではfor文は、returnを使わない
    for (double bpm in generatedBpmList) {
      // ボタンをリストに追加
      buttons.add(
        ElevatedButton(
          onPressed: () {
            // ボタンが押されたときの処理
            print('Button pressed: $bpm');
          },
          child: Text(bpm.toString()),
        ),
      );
    }

    return buttons;
  }
}

Discussion