Dart kullanarak nasıl rastgele sayılar üretirim?
Dart kullanarak nasıl rastgele sayılar üretirim?
Yanıtlar:
Şu kaynaktan Random
sı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.
/dev/urandom
, File
sınıfla birlikte okumakta daha iyi olursunuz.
Bunu kitaplıkta bulunan Random
sı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:math
nextInt()
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
Ş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.
İş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.
Güvenli bir rastgele API eklendi dart:math
new Random.secure()
dart:math
Random
secure
oluş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 ( urandom
sunucuda olduğu gibi ) delegeler
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
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.
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
bu kitaplığı kullanın http://dart.googlecode.com/svn/branches/bleeding_edge/dart/lib/math/random.dart , yakında sdk'ye dahil edileceğini düşündüğüm iyi bir rastgele oluşturucu sağladı umarım yardımcı olur
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.
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 :)