Jak generować liczby losowe za pomocą Dart?
Jak generować liczby losowe za pomocą Dart?
Odpowiedzi:
Użyj Random
klasy 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.
/dev/urandom
z File
klasą, jeśli chcesz kryptograficznie silne liczby losowe.
Możesz to osiągnąć poprzez Random
obiekt klasy random.nextInt(max)
znajdujący się w dart:math
bibliotece. nextInt()
Metoda wymaga maksymalnego limitu. Liczba losowa zaczyna się od, 0
a 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
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.
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).
Bezpieczny losowy interfejs API został właśnie dodany do dart:math
new Random.secure()
dart:math
Random
dodanosecure
konstruktor 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 urandom
na serwerze)
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
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.
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
użyj tej biblioteki http://dart.googlecode.com/svn/branches/bleeding_edge/dart/lib/math/random.dart zapewnił dobry generator losowy, który myślę, że zostanie wkrótce dołączony do sdk Mam nadzieję, że to pomoże
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.
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