Bagaimana cara menghasilkan angka acak di Dart?

128

Bagaimana cara menghasilkan angka acak menggunakan Dart?

Seth Ladd
sumber
4
Bagaimana Anda tahu itu nomor buruk? Hal tentang acak adalah bahwa Anda tidak pernah benar-benar tahu ... i46.tinypic.com/2vw7237.gif
corsiKa
2
Percayalah, Anda akan tahu mereka buruk jika Anda menggunakan dart: core Math. :) Inilah bugnya
Seth Ladd
3
Jika Anda ingin mengetahui apakah nomor acak Anda buruk, gunakan perpustakaan ChiSquare saya untuk mencari tahu: github.com/kaisellgren/ChiSquare
Kai Sellgren

Jawaban:

180

Gunakan Randomkelas dari dart:math:

import 'dart:math';

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

Kode ini telah diuji dengan VM Dart dan dart2js, pada saat penulisan ini.

Seth Ladd
sumber
1
Anda lebih baik membaca /dev/urandombersama Filekelas jika Anda menginginkan nomor acak yang kuat secara kriptografis.
Menara
Bagaimana dengan bilangan acak negatif (ganda)? Saya mencoba menerapkan metode randomRange yang akan menghasilkan misalnya dari -0,8 hingga 0,9 ... hasilnya akan menjadi misalnya -0,32
just_a_dude
2
@just_a_dude kedengarannya seperti pertanyaan yang sempurna untuk stackoverflow. Pertimbangkan untuk membuat pertanyaan baru :)
Seth Ladd
1
Metode yang akan menghasilkan misalnya dari -0,8 hingga 0,9 sederhana. Anda hanya perlu memetakan nilai. Rentang Anda 0,8 + 0,9 = 1,7. Jadi jika Anda memasukkan rng.nextInt (1700) Anda akan mendapatkan angka antara 0 dan 1700. Bagi dengan 100 dan kurangi -0,8. Artinya yourRnd = rng.nextInt (1700) /100.0-0.8. Ada lebih banyak opsi yang dapat Anda gunakan seperti tidak menggunakan nextInt melainkan menggandakan 0-1, ditambah 1,7 dan digeser -0,8
Veljac
28

Anda dapat mencapainya melalui Randomobjek kelas random.nextInt(max), yang ada di dart:mathperpustakaan. The nextInt()Metode membutuhkan batas max. Nomor acak dimulai dari 0dan batas maksimal itu sendiri bersifat eksklusif.

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

Jika Anda ingin menambahkan batas min, tambahkan batas min ke hasil

int randomNumber = random.nextInt(90) + 10; // from 10 upto 99 included
Samir Rahimy
sumber
bukankah jawaban Anda menyertakan angka dari 10 hingga 109 disertakan?
Tim
@Tim terima kasih karena memperhatikan, saya baru saja menyalin kode dari baris sebelumnya. Selesaikan itu.
Samir Rahimy
17

Jika Anda memerlukan nomor acak yang aman secara kriptografik (mis. Untuk enkripsi), dan Anda berada di browser, Anda dapat menggunakan DOM cryptography API :

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

Ini berfungsi di Dartium, Chrome, dan Firefox, tetapi kemungkinan tidak di browser lain karena ini adalah API eksperimental.

Sam McCall
sumber
17

Berikut potongan untuk membuat daftar nomor acak

import 'dart:math';

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

Ini akan menghasilkan daftar 12 bilangan bulat dari 0 hingga 99 (inklusif).

Mark E. Haase
sumber
9

API acak yang aman baru saja ditambahkan ke dart:math

new Random.secure()

dart:math Randommenambahkan securekonstruktor yang mengembalikan generator acak yang aman secara kriptografik yang membaca dari sumber entropi yang disediakan oleh embedder untuk setiap nilai acak yang dihasilkan.

yang didelegasikan ke window.crypto.getRandomValues()dalam browser dan ke OS (seperti urandomdi server)

Günter Zöchbauer
sumber
API baru ini tersedia dalam versi 1.14-dev atau lebih tinggi.
Seth Ladd
7

Tidak dapat berkomentar karena saya baru saja membuat akun ini, tetapi saya ingin memastikan bahwa solusi @ eggrobot78 berfungsi, tetapi bersifat eksklusif dalam dart sehingga tidak menyertakan nomor terakhir. Jika Anda mengubah baris terakhir menjadi "r = min + rnd.nextInt (max - min + 1);", maka itu harus menyertakan angka terakhir juga.

Penjelasan:

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
Chad McAdams
sumber
4

coba ini, Anda dapat mengontrol nilai 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..
}
Aymen
sumber
3

Solusi alternatif dapat menggunakan kode DRandom berikut . Kelas ini harus digunakan dengan benih. Ini menyediakan antarmuka yang akrab dengan apa yang Anda harapkan di .NET, itu porting dari Random.cs mono. Kode ini mungkin tidak aman kriptografi dan belum diuji secara statistik.

adam-penyanyi
sumber
Saya telah menggunakan DRandom sebelumnya. Lib bagus!
John Evans
3

Baru saja menulis kelas kecil ini untuk menghasilkan angka Acak Normal ... itu adalah titik awal yang layak untuk pemeriksaan yang perlu saya lakukan. (Set ini akan didistribusikan pada kurva berbentuk "lonceng".) Benih akan ditetapkan secara acak, tetapi jika Anda ingin dapat menghasilkan kembali satu set, Anda cukup melewatkan beberapa benih tertentu dan set yang sama akan dihasilkan.

Selamat bersenang-senang...

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

Kemudian Anda bisa menggunakannya seperti ini untuk memeriksa mean set 1000 nums yang dihasilkan antara batas rendah dan tinggi. Nilai disimpan di kelas sehingga bisa diakses setelah pembuatan instance.

_swarmii

george koller
sumber
1

Bagi saya cara termudah adalah melakukannya:

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

Terima kasih untuk penjelasan @ adam-singers di sini.

eggrobot78.dll
sumber
1

itu berhasil untuk saya new Random().nextInt(100); // MAX = number

itu akan memberikan 0 hingga 99 nomor acak

Contoh ::

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

Izinkan saya menjawab pertanyaan ini dengan contoh praktis dalam bentuk aplikasi pengguliran dadu sederhana yang memanggil 1 dari 6 gambar wajah dadu secara acak ke layar saat diketuk.

pertama-tama deklarasikan variabel yang menghasilkan angka acak (jangan lupa untuk mengimpor dart.math). Kemudian nyatakan variabel yang mengurai bilangan acak awal dalam batasan antara 1 dan 6 sebagai Integer.

Kedua variabel bersifat statis privat agar dapat diinisialisasi sekali. Ini bukan masalah besar tetapi akan menjadi praktik yang baik jika Anda harus menginisialisasi sejumlah besar angka acak.

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

Sekarang buat widget Deteksi gerakan dengan ClipRRect sebagai anak untuk mengembalikan salah satu dari enam gambar wajah dadu ke layar saat diketuk.

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

Nomor acak baru dibuat setiap kali Anda mengetuk layar dan nomor itu direferensikan untuk memilih gambar wajah dadu mana yang dipilih.

Saya harap contoh ini membantu :)

Aplikasi bergulir dadu menggunakan nomor acak dalam panah

Nzuzo
sumber