Dart'ta nasıl rastgele sayılar üretirim?


128

Dart kullanarak nasıl rastgele sayılar üretirim?


4
Kötü sayı olduklarını nereden biliyorsun? Rastgele ile ilgili olan şey, asla gerçekten söyleyemeyeceğinizdir ... i46.tinypic.com/2vw7237.gif
corsiKa

2
İnanın bana, dart: core Math kullanırsanız kötü olduklarını bilirsiniz. :) İşte hata: code.google.com/p/dart/issues/detail?id=499
Seth Ladd

3
Rastgele sayılarınızın kötü olup olmadığını öğrenmek istiyorsanız, öğrenmek için ChiSquare kitaplığımı kullanın: github.com/kaisellgren/ChiSquare
Kai Sellgren

Yanıtlar:


180

Şu kaynaktan Randomsınıfı kullan dart:math:

import 'dart:math';

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

Bu kod, bu yazının yazıldığı tarih itibariyle Dart VM ve dart2js ile test edilmiştir.


1
Kriptografik olarak güçlü rastgele sayılar istiyorsanız /dev/urandom, Filesınıfla birlikte okumakta daha iyi olursunuz.
Tower

Negatif rastgele sayılar (çiftler) nasıl olur? Örneğin -0.8'den 0.9'a kadar üretecek bir randomRange yöntemi uygulamaya çalışıyorum ... sonuç örneğin -0.32
just_a_dude

2
@just_a_dude, stackoverflow için mükemmel bir soru gibi görünüyor. Yeni bir soru oluşturmayı düşünün :)
Seth Ladd 08

1
Örneğin -0.8'den 0.9'a kadar üretecek yöntem basittir. Sadece değerleri eşlemeniz gerekiyor. Aralığınız 0,8 + 0,9 = 1,7. Yani, rng.nextInt (1700) koyarsanız, 0 ile 1700 arasında bir sayı elde edersiniz. 100'e bölün ve -0,8'i azaltın. Anlamı yourRnd = rng.nextInt (1700) /100.0-0.8. NextInt'i bile kullanmamak yerine 0-1'i çift, 1,7 oranında miltip ve -0,8 kaydırılmış gibi kullanabileceğiniz daha fazla seçenek var
Veljac 30'19

28

Bunu kitaplıkta bulunan Randomsınıf nesnesi aracılığıyla elde edebilirsiniz . Yöntem, maksimum sınırı gerektirir. Rastgele sayı başlar ve maksimum sınırın kendisi özeldir.random.nextInt(max)dart:mathnextInt()0

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

Minimum sınırı eklemek istiyorsanız, sonuca minimum sınırı ekleyin

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

Cevabınız 10'dan 109'a kadar sayıları içermiyor mu?
Tim

@ Fark ettiğiniz için teşekkürler, kodu önceki satırdan kopyaladım. Çözdü.
Samir Rahimy

17

Şifreleme açısından güvenli rasgele sayılara ihtiyacınız varsa (ör. Şifreleme için) ve bir tarayıcıdaysanız, DOM şifreleme API'sini kullanabilirsiniz :

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

Bu, Dartium, Chrome ve Firefox'ta çalışır, ancak bu deneysel bir API olduğu için büyük olasılıkla diğer tarayıcılarda çalışmaz.


17

İşte rastgele sayıların bir listesini oluşturmak için bir pasaj

import 'dart:math';

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

Bu, 0'dan 99'a kadar (dahil) 12 tam sayıdan oluşan bir liste oluşturacaktır.


9

Güvenli bir rastgele API eklendi dart:math

new Random.secure()

dart:math Randomsecureoluşturulan her rastgele değer için katıştırıcı tarafından sağlanan entropi kaynağından okuyan şifreleme açısından güvenli bir rastgele oluşturucu döndüren bir kurucu eklendi .

window.crypto.getRandomValues()tarayıcıda ve işletim sisteminde ( urandomsunucuda olduğu gibi ) delegeler


Bu yeni API, 1.14 dev veya üzeri sürümlerde mevcuttur.
Seth Ladd

7

Bu hesabı yeni oluşturduğum için yorum yapamıyorum, ancak @ eggrobot78'in çözümünün çalıştığına dikkat etmek istedim, ancak dartta özel olduğu için son numarayı içermiyor. Son satırı "r = min + rnd.nextInt (max - min + 1);" olarak değiştirirseniz, son sayıyı da içermelidir.

Açıklama:

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

bunu deneyin, min / maks değerini kontrol edebilirsiniz:

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

Alternatif bir çözüm aşağıdaki DRandom kodunu kullanmak olabilir . Bu sınıf bir tohumla kullanılmalıdır. .NET'te beklediğinize tanıdık bir arayüz sağlar, mono'nun Random.cs'inden alınmıştır. Bu kod kriptografi açısından güvenli olmayabilir ve istatistiksel olarak test edilmemiştir.


Daha önce DRandom kullandım. İyi lib!
John Evans

3

Bu küçük sınıfı Normal Rastgele sayılar üretmek için yazdım ... Yapmam gereken kontrol için iyi bir başlangıç ​​noktasıydı. (Bu kümeler "çan" şeklindeki bir eğri üzerinde dağıtılacaktır.) Çekirdek rastgele ayarlanacaktır, ancak bir kümeyi yeniden oluşturabilmek istiyorsanız, yalnızca belirli bir çekirdek geçebilirsiniz ve aynı küme üretilecektir.

İyi eğlenceler...

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);

Daha sonra, bir alt ve üst sınır arasında oluşturulan 1000 sayılık kümelerin ortalamasını kontrol etmek için sadece bu şekilde kullanabilirsiniz. Değerler sınıfta depolanır, böylece somutlaştırmadan sonra bunlara erişilebilir.

_swarmii



1

Benim için en kolay yol şunu yapmaktır:

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

Buradaki @ adam-singer açıklaması sayesinde .


1

benim için çalıştı new Random().nextInt(100); // MAX = number

0 ila 99 rasgele sayı verecek

Eample ::

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

0

Bu soruyu basit bir zar atma uygulaması şeklinde pratik bir örnekle çözmeme izin verin ve dokunulduğunda 6 zar yüz görüntüsünden birini rastgele ekrana çağırıyor.

önce rastgele sayılar üreten bir değişken belirtin (dart.math'ı içe aktarmayı unutmayın). Ardından, ilk rastgele sayıyı 1 ile 6 arasındaki kısıtlamalar içinde bir Tamsayı olarak ayrıştıran bir değişken bildirin.

Her iki değişken de bir kez başlatılmak üzere statik özeldir. Bu çok büyük bir sorun değildir, ancak bir grup rastgele sayıyı başlatmanız gerekirse iyi bir uygulama olacaktır.

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

Şimdi, dokunulduğunda altı zar yüz görüntüsünden birini ekrana döndürmek için çocukken ClipRRect içeren bir Hareket algılama widget'ı oluşturun.

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,
              ),
          )
        ),

Ekrana her dokunduğunuzda yeni bir rastgele sayı üretilir ve bu sayı, hangi zar yüzü görüntüsünün seçildiğini seçmek için referans alınır.

Bu örneğin yardımcı olmasını umuyordum :)

Dartta rastgele sayılar kullanarak zar atma uygulaması

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.