Làm cách nào để tạo số ngẫu nhiên bằng Dart?
Làm cách nào để tạo số ngẫu nhiên bằng Dart?
Câu trả lời:
Sử dụng Random
lớ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.
/dev/urandom
cùng File
lớp nếu bạn muốn các số ngẫu nhiên mạnh về mặt mật mã.
Bạn có thể đạt được nó thông qua Random
đối tượng lớp random.nextInt(max)
, trong dart:math
thư 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ừ 0
và 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
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.
Đâ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ả).
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ứcsecure
khở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ư urandom
trên máy chủ)
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
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ê.
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
sử dụng thư viện này http://dart.googlecode.com/svn/braches/bleeding_edge/dart/lib/math/random.dart đã cung cấp một trình tạo ngẫu nhiên tốt mà tôi nghĩ sẽ sớm được đưa vào sdk, hy vọng nó sẽ hữu ích
Đố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.
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 :)