Jak generować liczby losowe w Dart?


128

Jak generować liczby losowe za pomocą Dart?


4
Skąd wiesz, że to złe liczby? Rzecz w przypadku losowości polega na tym, że tak naprawdę nigdy nie można powiedzieć ... i46.tinypic.com/2vw7237.gif
corsiKa

2
Zaufaj mi, wiedziałbyś, że są złe, gdybyś użył strzałki: podstawowa matematyka. :) Oto błąd: code.google.com/p/dart/issues/detail?id=499
Seth Ladd

3
Jeśli chcesz wiedzieć, czy twoje losowe liczby są złe, skorzystaj z mojej biblioteki ChiSquare, aby dowiedzieć się: github.com/kaisellgren/ChiSquare
Kai Sellgren

Odpowiedzi:


180

Użyj Randomklasy z dart:math:

import 'dart:math';

main() {
  var rng = new Random();
  for (var i = 0; i < 10; i++) {
    print(rng.nextInt(100));
  }
}

Ten kod został przetestowany z Dart VM i dart2js, w momencie pisania tego tekstu.


1
Lepiej czytać /dev/urandomz Fileklasą, jeśli chcesz kryptograficznie silne liczby losowe.
Wieża

A co z ujemnymi liczbami losowymi (podwójnymi)? Próbuję zaimplementować metodę randomRange, która generowałaby na przykład od -0,8 do 0,9 ... wynik byłby na przykład -0,32
just_a_dude

2
@just_a_dude, które brzmi jak idealne pytanie do stackoverflow. Rozważ utworzenie nowego pytania :)
Seth Ladd

1
metoda, która wygeneruje na przykład od -0,8 do 0,9 jest prosta. Wystarczy zmapować wartości. Twój zakres to 0,8 + 0,9 = 1,7. Więc jeśli wstawisz rng.nextInt (1700), otrzymasz liczbę od 0 do 1700. Podziel przez 100 i zmniejsz -0,8. Czyli yourRnd = rng.nextInt (1700) / 100,0-0,8. Jest więcej opcji, których możesz użyć, na przykład nawet nie używając nextInt, ale raczej podwójne 0-1, mnożone przez 1,7 i przesunięte o -0,8
Veljac

28

Możesz to osiągnąć poprzez Randomobiekt klasy random.nextInt(max)znajdujący się w dart:mathbibliotece. nextInt()Metoda wymaga maksymalnego limitu. Liczba losowa zaczyna się od, 0a sam maksymalny limit jest wyłączny.

import 'dart:math';
Random random = new Random();
int randomNumber = random.nextInt(100); // from 0 upto 99 included

Jeśli chcesz dodać limit minimalny, dodaj limit minimalny do wyniku

int randomNumber = random.nextInt(90) + 10; // from 10 upto 99 included

czy twoja odpowiedź nie zawiera liczb od 10 do 109?
Tim

@Tim dzięki, że zauważyłeś, właśnie skopiowałem kod z poprzedniego wiersza. Rozwiązałem to.
Samir Rahimy

17

Jeśli potrzebujesz zabezpieczonych kryptograficznie liczb losowych (np. Do szyfrowania) i korzystasz z przeglądarki, możesz skorzystać z DOM Cryptography API :

int random() {
  final ary = new Int32Array(1);
  window.crypto.getRandomValues(ary);
  return ary[0];
}

Działa to w Dartium, Chrome i Firefox, ale prawdopodobnie nie w innych przeglądarkach, ponieważ jest to eksperymentalny interfejs API.


17

Oto fragment służący do generowania listy liczb losowych

import 'dart:math';

main() {
  var rng = new Random();
  var l = new List.generate(12, (_) => rng.nextInt(100));
}

Spowoduje to wygenerowanie listy 12 liczb całkowitych od 0 do 99 (włącznie).


9

Bezpieczny losowy interfejs API został właśnie dodany do dart:math

new Random.secure()

dart:math Randomdodano securekonstruktor zwracający bezpieczny kryptograficznie generator losowy, który czyta ze źródła entropii dostarczonego przez program osadzający dla każdej wygenerowanej wartości losowej.

który deleguje window.crypto.getRandomValues()w przeglądarce i do systemu operacyjnego (jak urandomna serwerze)


Ten nowy interfejs API jest dostępny w wersji 1.14-dev lub nowszej.
Seth Ladd

7

Nie mogę komentować, ponieważ właśnie utworzyłem to konto, ale chciałem się upewnić, że rozwiązanie @ eggrobot78 działa, ale jest wyłączne w dart, więc nie zawiera ostatniej liczby. Jeśli zmienisz ostatnią linię na "r = min + rnd.nextInt (max - min + 1);", to powinna również zawierać ostatnią liczbę.

Wyjaśnienie:

max = 5;
min = 3;
Random rnd = new Random();
r = min + rnd.nextInt(max - min);
//max - min is 2
//nextInt is exclusive so nextInt will return 0 through 1
//3 is added so the line will give a number between 3 and 4
//if you add the "+ 1" then it will return a number between 3 and 5

4

spróbuj tego, możesz kontrolować wartość min / max:

import 'dart:math';

void main(){
  random(min, max){
    var rn = new Random();
    return min + rn.nextInt(max - min);
  }
  print(random(5,20)); // Output : 19, 6, 15..
}

3

Alternatywnym rozwiązaniem mogłoby być użycie następującego kodu DRandom . Ta klasa powinna być używana z nasionem. Zapewnia znajomy interfejs do tego, czego można oczekiwać w .NET, został przeniesiony z Random.cs firmy mono. Ten kod może nie być bezpieczny dla kryptografii i nie został przetestowany statystycznie.


Używałem wcześniej DRandom. Dobra lib!
John Evans,

3

Właśnie napisałem tę małą klasę do generowania liczb Normal Random ... to był przyzwoity punkt wyjścia do sprawdzenia, które muszę zrobić. (Te zestawy będą rozłożone na krzywej w kształcie „dzwonu”.) Ziarno zostanie ustawione losowo, ale jeśli chcesz mieć możliwość ponownego wygenerowania zestawu, możesz po prostu przekazać określone ziarno, a ten sam zestaw zostanie wygenerowany.

Baw się dobrze...

class RandomNormal {
  num     _min, _max,  _sum;
  int     _nEle, _seed, _hLim;
  Random  _random;
  List    _rNAr;

  //getter
  List get randomNumberAr => _rNAr;

  num _randomN() {
    int r0 = _random.nextInt(_hLim);
    int r1 = _random.nextInt(_hLim);
    int r2 = _random.nextInt(_hLim);
    int r3 = _random.nextInt(_hLim);

    num rslt = _min + (r0 + r1 + r2 + r3) / 4000.0;  //Add the OS back in...
    _sum += rslt; //#DEBUG ONLY
    return( rslt );
  }

  RandomNormal(this._nEle, this._min, this._max, [this._seed = null]) {
    if (_seed == null ) {
      Random r = new Random();
      _seed    = r.nextInt(1000);
    }
    _hLim   = (_max - _min).ceil() * 1000;
    _random = new Random(_seed);
    _rNAr   = [];
    _sum    = 0;//#DEBUG ONLY

    h2("RandomNormal with k: ${_nEle}, Seed: ${_seed}, Min: ${_min}, Max: ${_max}");//#DEBUG ONLY
    for(int n = 0; n < _nEle; n++ ){
      num randomN = _randomN();
      //p("randomN  = ${randomN}");
      LIST_add( _rNAr, randomN );
    }

    h3("Mean = ${_sum/_nEle}");//#DEBUG ONLY
  }
}


new RandomNormal(1000, 80, 120);
new RandomNormal(1000, 80, 120);
new RandomNormal(1000, 80, 120);
new RandomNormal(1000, 80, 120);
new RandomNormal(1000, 80, 120);
new RandomNormal(1000, 80, 120);
new RandomNormal(1000, 80, 120);

Następnie możesz po prostu użyć tego w ten sposób, aby sprawdzić średnią z zestawów 1000 num wygenerowanych między dolnym a górnym limitem. Wartości są przechowywane w klasie, dzięki czemu można uzyskać do nich dostęp po utworzeniu instancji.

_swarmii



1

Dla mnie najłatwiej jest zrobić:

import 'dart:math';
Random rnd = new Random();
r = min + rnd.nextInt(max - min);
//where min and max should be specified.

Dzięki wyjaśnieniu @ adam-singer tutaj.


1

to zadziałało dla mnie new Random().nextInt(100); // MAX = number

da liczbę losową od 0 do 99

Eample ::

import 'dart:math';
int MAX = 100;
print(new Random().nextInt(MAX));`

0

Pozwólcie, że rozwiążę to pytanie za pomocą praktycznego przykładu w postaci prostej aplikacji do rzucania kostkami, która po dotknięciu wywołuje losowe obrazy twarzy 1 z 6 kości na ekranie.

najpierw zadeklaruj zmienną, która generuje liczby losowe (nie zapomnij zaimportować dart.math). Następnie zadeklaruj zmienną, która analizuje początkową liczbę losową w ramach ograniczeń od 1 do 6 jako liczbę całkowitą.

Obie zmienne są statycznie prywatne, aby można je było zainicjować raz. Nie jest to wielka sprawa, ale byłaby to dobra praktyka, gdybyś musiał zainicjalizować całą grupę liczb losowych.

static var _random = new Random();
static var _diceface = _rnd.nextInt(6) +1 ;

Teraz utwórz widżet wykrywania gestów z ClipRRectem jako dziecko, aby po dotknięciu przywrócić jeden z sześciu obrazów twarzy kości na ekran.

GestureDetector(
          onTap: () {
            setState(() {
              _diceface = _rnd.nextInt(6) +1 ;
            });
          },
          child: ClipRRect(
            clipBehavior: Clip.hardEdge,
            borderRadius: BorderRadius.circular(100.8),
              child: Image(
                image: AssetImage('images/diceface$_diceface.png'),
                fit: BoxFit.cover,
              ),
          )
        ),

Za każdym dotknięciem ekranu generowana jest nowa liczba losowa, która służy do wyboru obrazu twarzy kości.

Mam nadzieję, że ten przykład pomógł :)

Aplikacja do rzucania kostkami przy użyciu liczb losowych w rzutce

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.