🃏
Listを操作する
乱数を使ってロジックを作ってみる
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についてのメソッドが紹介されているリンクを貼っておきます。
どんな時にこのようなプログラムを使ったかというと、ボタンをランダムに生成したいロジックを作るときに使いました。
ボタンを作るときは、こんな感じのコードを書きます。参考までにどうぞ
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