Làm cách nào để tạo số ngẫu nhiên trong Dart?


128

Làm cách nào để tạo số ngẫu nhiên bằng Dart?


4
Làm sao bạn biết chúng là số xấu? Những điều về ngẫu nhiên là bạn có thể không bao giờ thực sự nói ... i46.tinypic.com/2vw7237.gif
corsiKa

2
Tin tôi đi, bạn sẽ biết chúng rất tệ nếu bạn sử dụng dart: core Math. :) Đây là lỗi: code.google.com/p/dart/issues/detail?id=499
Seth Ladd vào

3
Nếu bạn muốn biết liệu số ngẫu nhiên của bạn là xấu, sử dụng thư viện ChiSquare của tôi để tìm hiểu: github.com/kaisellgren/ChiSquare
Kai Sellgren

Câu trả lời:


180

Sử dụng Randomlớp từ dart:math:

import 'dart:math';

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

Mã này đã được thử nghiệm với Dart VM và dart2js, tính đến thời điểm viết bài này.


1
Tốt hơn hết bạn nên đọc /dev/urandomcùng Filelớp nếu bạn muốn các số ngẫu nhiên mạnh về mặt mật mã.
Tower

Làm thế nào về số ngẫu nhiên âm (nhân đôi)? Tôi đang cố gắng để thực hiện một phương pháp randomRange rằng sẽ tạo ra ví dụ từ -0.8 đến 0.9 ... kết quả sẽ là ví dụ -0,32
just_a_dude

2
@just_a_dude nghe có vẻ là một câu hỏi hoàn hảo cho stackoverflow. Cân nhắc tạo một câu hỏi mới :)
Seth Ladd,

1
phương thức sẽ tạo ra ví dụ từ -0,8 đến 0,9 là đơn giản. Bạn chỉ cần ánh xạ các giá trị. Phạm vi của bạn là 0,8 + 0,9 = 1,7. Vì vậy, nếu bạn đặt rng.nextInt (1700), bạn sẽ nhận được số từ 0 đến 1700. Chia cho 100 và giảm -0,8. Có nghĩa là yourRnd = rng.nextInt (1700) /100.0-0.8. Có rất nhiều lựa chọn, bạn có thể sử dụng như thậm chí không sử dụng nextInt nhưng thay vì đôi 0-1, miltiplied bằng 1,7 và chuyển -0.8
Veljac

28

Bạn có thể đạt được nó thông qua Randomđối tượng lớp random.nextInt(max), trong dart:maththư viện. Các nextInt()phương pháp đòi hỏi một giới hạn tối đa. Số ngẫu nhiên bắt đầu từ 0và bản thân giới hạn tối đa là độc quyền.

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

Nếu bạn muốn thêm giới hạn tối thiểu, hãy thêm giới hạn tối thiểu vào kết quả

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

câu trả lời của bạn không bao gồm các số từ 10 đến 109 được bao gồm?
Tim

@Tim cảm ơn vì đã chú ý, tôi vừa sao chép mã từ dòng trước. Đã giải quyết nó.
Samir Rahimy

17

Nếu bạn cần các số ngẫu nhiên được bảo mật bằng mật mã (ví dụ: để mã hóa) và đang sử dụng trình duyệt, bạn có thể sử dụng API mã hóa DOM :

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

Điều này hoạt động trong Dartium, Chrome và Firefox, nhưng có thể không hoạt động trong các trình duyệt khác vì đây là một API thử nghiệm.


17

Đây là đoạn mã để tạo danh sách các số ngẫu nhiên

import 'dart:math';

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

Thao tác này sẽ tạo ra một danh sách 12 số nguyên từ 0 đến 99 (bao gồm cả).


9

Một API ngẫu nhiên an toàn vừa được thêm vào dart:math

new Random.secure()

dart:math Randomđã thêm một phương thức securekhởi tạo trả về một trình tạo ngẫu nhiên an toàn bằng mật mã đọc từ nguồn entropy do trình nhúng cung cấp cho mọi giá trị ngẫu nhiên được tạo.

ủy quyền nào window.crypto.getRandomValues()trong trình duyệt và hệ điều hành (như urandomtrên máy chủ)


API mới này có sẵn trong 1.14-dev trở lên.
Seth Ladd

7

Không thể nhận xét vì tôi vừa tạo tài khoản này, nhưng tôi muốn đảm bảo chỉ ra rằng giải pháp của @ eggrobot78 hoạt động, nhưng nó là độc quyền trong phi tiêu nên không bao gồm số cuối cùng. Nếu bạn thay đổi dòng cuối cùng thành "r = min + rnd.nextInt (max - min + 1);", thì nó cũng phải bao gồm cả số cuối cùng.

Giải trình:

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

hãy thử điều này, bạn có thể kiểm soát giá trị tối thiểu / tối đa:

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

Một giải pháp thay thế có thể được sử dụng mã DRandom sau đây . Lớp này nên được sử dụng với một hạt giống. Nó cung cấp một giao diện quen thuộc với những gì bạn mong đợi trong .NET, nó được chuyển từ Random.cs của mono. Mã này có thể không phải là mật mã an toàn và chưa được kiểm tra thống kê.


Tôi đã sử dụng DRandom trước đây. Tốt lib!
John Evans

3

Vừa mới viết một lớp nhỏ này để tạo Bình thường số Ngẫu nhiên ... đó là một điểm khởi đầu tốt cho việc kiểm tra tôi cần làm. (Các tập hợp này sẽ phân bố trên một đường cong hình "chuông".) Hạt giống sẽ được đặt ngẫu nhiên, nhưng nếu bạn muốn có thể tạo lại một bộ, bạn có thể chuyển một số hạt cụ thể và cùng một bộ sẽ tạo ra.

Chúc vui vẻ...

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

Sau đó, bạn chỉ có thể sử dụng nó như thế này để kiểm tra giá trị trung bình của bộ 1000 num được tạo ra giữa giới hạn thấp và cao. Các giá trị được lưu trữ trong lớp để chúng có thể được truy cập sau khi khởi tạo.

_swarmii



1

Đối với tôi, cách dễ nhất là làm:

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

Cảm ơn @ adam-ca sĩ giải thích ở đây.


1

nó làm việc cho tôi new Random().nextInt(100); // MAX = number

nó sẽ cho số ngẫu nhiên từ 0 đến 99

Ví dụ ::

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

0

Hãy để tôi giải quyết câu hỏi này bằng một ví dụ thực tế dưới dạng một ứng dụng lăn xúc xắc đơn giản gọi 1 trong 6 hình ảnh mặt xúc xắc xuất hiện ngẫu nhiên trên màn hình khi chạm vào.

đầu tiên khai báo một biến tạo số ngẫu nhiên (đừng quên nhập dart.math). Sau đó, khai báo một biến phân tích cú pháp số ngẫu nhiên ban đầu trong các ràng buộc từ 1 đến 6 dưới dạng Số nguyên.

Cả hai biến đều là static private để được khởi tạo một lần, đây không phải là một vấn đề lớn nhưng sẽ là một thực tiễn tốt nếu bạn phải khởi tạo một loạt các số ngẫu nhiên.

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

Bây giờ, hãy tạo tiện ích phát hiện cử chỉ với ClipRRect khi còn nhỏ để trả lại một trong sáu hình ảnh mặt xúc xắc về màn hình khi chạm vào.

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

Một số ngẫu nhiên mới được tạo mỗi khi bạn chạm vào màn hình và số đó được tham chiếu để chọn hình ảnh mặt xúc xắc nào được chọn.

Tôi hy vọng ví dụ này giúp ích :)

Ứng dụng lăn xúc xắc sử dụng số ngẫu nhiên trong phi tiêu

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.