Skip to content
Kezdőlap » Véletlenszám generálás

Véletlenszám generálás

  • Dart

Sok esetben előfordul az a programozói munka során, hogy valamilyen véletlenszámra van szükségünk. A Dart-nak van egy math csomagja,

import 'dart:math';

amit importálni kell. Ez után már tudjuk használni a Random() konstruktor függvényt arra, hogy kreáljunk egy objektumot. Ennek a véletlenszám objektumnak van számos metódusa:

Random

Például a nextInt() alkalmas arra, hogy generáljon egy véletlen egész számot. A metódusnak meg kell adni egy maximum egész értéket, aminél nagyobbat nem akarunk generáltatni. Illetőleg ez alatti számokat fog nekünk generálgatni.

Ha tehát azt mondom, hogy

var intValue = Random().nextInt(10);

Akkor az eredmény egy olyan egész szám lesz, ami nagyobb vagy egyenlő nullával és kisebb, mint 10. tehát 0 és 9 közötti egész számok lehetségesek.

Ha mondjuk dobókockához akarunk 1 és 6 közötti számokat generálni, akkor annak a helyes megoldása ez lesz:

var dobokockaErtek = Random(6) + 1;

Optimalizálás

Abban az esetben, ha mondjuk egy StatefulWidget-en belül kell generálnunk véletlenszámot, valahányszor egy gombra kattintunk, akkor a következőre érdemes odafigyelni: minden egyes Random() hívással egy új véletlenszám objektumot hozunk létre. Szerencsére a nem használt objektumok eldobásra kerülnek, tehát nem foglalják a memóriát. De ennek ellenére is fennáll az az eset, hogy egynél több objektum kerül létrehozásra, amit aztán a Flutternek ki kell onnan takarítania.

Itt van tehát ez az eset, amit optimalizálni kellene:

class DiceRoller extends StatefulWidget {
  // ...
}

class _DiceRollerState extends State<DiceRoller> {
  var currentDiceRoll = 2;

  void rollDice() {
    setState(() {
      currentDiceRoll = Random().nextInt(6) + 1;
    });
  }

A megoldás az, hogy a véletlenszám objektum létrehozást, tehát a Random() hívását beletesszük egy final változóba. Például így:

final randomizer = Random();

class DiceRoller extends StatefulWidget {
  // ...
}

class _DiceRollerState extends State<DiceRoller> {
  var currentDiceRoll = 2;

  void rollDice() {
    setState(() {
      currentDiceRoll = randomizer.nextInt(6) + 1;
    });
  }

Azzal, hogy létrehoztuk a randomizer nevű változót és inicializáltuk is, már nem fenyeget az a veszély, hogy új objektum jön létre.

Vélemény, hozzászólás?

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük