ฉันจะสร้างตัวเลขสุ่มโดยใช้ Dart ได้อย่างไร
ฉันจะสร้างตัวเลขสุ่มโดยใช้ Dart ได้อย่างไร
คำตอบ:
ใช้Random
คลาสจากdart:math
:
import 'dart:math';
main() {
var rng = new Random();
for (var i = 0; i < 10; i++) {
print(rng.nextInt(100));
}
}
โค้ดนี้ได้รับการทดสอบกับ Dart VM และ dart2js ณ เวลาที่เขียนนี้
/dev/urandom
กับFile
ชั้นเรียนนี้ดีกว่าถ้าคุณต้องการตัวเลขสุ่มที่มีการเข้ารหัสที่แข็งแกร่ง
คุณสามารถบรรลุได้ผ่านRandom
วัตถุคลาสrandom.nextInt(max)
ซึ่งอยู่ในdart:math
ไลบรารี nextInt()
วิธีการต้องมีขีด จำกัด สูงสุด จำนวนสุ่มเริ่มต้น0
และขีด จำกัด สูงสุดนั้นเป็นเอกสิทธิ์
import 'dart:math';
Random random = new Random();
int randomNumber = random.nextInt(100); // from 0 upto 99 included
หากคุณต้องการเพิ่มขีด จำกัด ขั้นต่ำให้เพิ่มขีด จำกัด ขั้นต่ำลงในผลลัพธ์
int randomNumber = random.nextInt(90) + 10; // from 10 upto 99 included
หากคุณต้องการตัวเลขสุ่มที่ปลอดภัยในการเข้ารหัส (เช่นสำหรับการเข้ารหัส) และคุณอยู่ในเบราว์เซอร์คุณสามารถใช้DOM cryptography API :
int random() {
final ary = new Int32Array(1);
window.crypto.getRandomValues(ary);
return ary[0];
}
ใช้งานได้ใน Dartium, Chrome และ Firefox แต่อาจจะไม่ใช้ในเบราว์เซอร์อื่นเนื่องจากเป็น API ทดลอง
นี่คือตัวอย่างข้อมูลสำหรับสร้างรายการตัวเลขสุ่ม
import 'dart:math';
main() {
var rng = new Random();
var l = new List.generate(12, (_) => rng.nextInt(100));
}
สิ่งนี้จะสร้างรายการของจำนวนเต็ม 12 จำนวนตั้งแต่ 0 ถึง 99 (รวม)
เพิ่งเพิ่ม API แบบสุ่มที่ปลอดภัยลงใน dart:math
new Random.secure()
dart:math
Random
เพิ่มตัวsecure
สร้างที่ส่งคืนเครื่องกำเนิดไฟฟ้าแบบสุ่มที่มีการเข้ารหัสที่ปลอดภัยซึ่งอ่านจากแหล่งเอนโทรปีที่จัดเตรียมโดยโปรแกรมฝังสำหรับทุกค่าสุ่มที่สร้างขึ้น
ซึ่งมอบหมายให้window.crypto.getRandomValues()
ในเบราว์เซอร์และระบบปฏิบัติการ (เช่นurandom
บนเซิร์ฟเวอร์)
ไม่สามารถแสดงความคิดเห็นได้เนื่องจากฉันเพิ่งสร้างบัญชีนี้ แต่ฉันต้องการให้แน่ใจว่าวิธีการแก้ปัญหาของ @ eggrobot78 ใช้งานได้ แต่เป็นแบบพิเศษในโผดังนั้นจึงไม่รวมหมายเลขสุดท้าย หากคุณเปลี่ยนบรรทัดสุดท้ายเป็น "r = min + rnd.nextInt (max - min + 1);" ก็ควรรวมตัวเลขสุดท้ายด้วย
คำอธิบาย:
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
ลองทำเช่นนี้คุณสามารถควบคุมค่าต่ำสุด / สูงสุด:
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..
}
วิธีการแก้ปัญหาทางเลือกที่อาจจะมีการใช้รหัสต่อไปนี้DRandom ชั้นนี้ควรใช้กับเมล็ดพันธุ์ มันมีอินเทอร์เฟซที่คุ้นเคยกับสิ่งที่คุณคาดหวังใน. NET ซึ่งถูกย้ายมาจาก Random.cs ของโมโน รหัสนี้อาจไม่ปลอดภัยในการเข้ารหัสและยังไม่ได้รับการทดสอบทางสถิติ
เพิ่งเขียนคลาสเล็ก ๆ นี้เพื่อสร้างตัวเลขสุ่มปกติ ... มันเป็นจุดเริ่มต้นที่ดีสำหรับการตรวจสอบที่ฉันต้องทำ (ชุดเหล่านี้จะกระจายบนเส้นโค้งรูป "ระฆัง") เมล็ดพันธุ์จะถูกตั้งค่าแบบสุ่ม แต่ถ้าคุณต้องการสร้างชุดขึ้นมาใหม่คุณก็สามารถส่งเมล็ดพันธุ์ที่เฉพาะเจาะจงไปได้และชุดเดียวกันจะสร้างขึ้น
มีความสุข...
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);
จากนั้นคุณสามารถใช้มันในลักษณะนี้เพื่อตรวจสอบค่าเฉลี่ยของชุด 1,000 num ที่สร้างขึ้นระหว่างขีด จำกัด ต่ำและสูง ค่าจะถูกเก็บไว้ในคลาสเพื่อให้สามารถเข้าถึงได้หลังจากสร้างอินสแตนซ์
_swarmii
ใช้ไลบรารีนี้http://dart.googlecode.com/svn/branches/bleeding_edge/dart/lib/math/random.dartให้เครื่องกำเนิดไฟฟ้าแบบสุ่มที่ดีซึ่งฉันคิดว่าจะรวมอยู่ใน sdk ในไม่ช้าหวังว่าจะช่วยได้
สำหรับฉันวิธีที่ง่ายที่สุดคือทำ:
import 'dart:math';
Random rnd = new Random();
r = min + rnd.nextInt(max - min);
//where min and max should be specified.
ขอบคุณคำอธิบายของ @ adam-singer ที่นี่
มันใช้ได้ผลสำหรับฉัน new Random().nextInt(100); // MAX = number
จะให้หมายเลขสุ่ม 0 ถึง 99
Eample ::
import 'dart:math';
int MAX = 100;
print(new Random().nextInt(MAX));`
ให้ฉันไขคำถามนี้ด้วยตัวอย่างที่ใช้ได้จริงในรูปแบบของแอพทอยลูกเต๋าแบบง่ายๆที่เรียก 1 ใน 6 รูปหน้าลูกเต๋าแบบสุ่มไปที่หน้าจอเมื่อแตะ
ก่อนอื่นให้ประกาศตัวแปรที่สร้างตัวเลขสุ่ม (อย่าลืมนำเข้า dart.math) จากนั้นประกาศตัวแปรที่แยกวิเคราะห์จำนวนสุ่มเริ่มต้นภายในข้อ จำกัด ระหว่าง 1 ถึง 6 เป็นจำนวนเต็ม
ตัวแปรทั้งสองเป็นแบบคงที่เพื่อที่จะเริ่มต้นครั้งเดียวนี่ไม่ใช่เรื่องใหญ่ แต่จะเป็นแนวทางปฏิบัติที่ดีหากคุณต้องเริ่มต้นจำนวนสุ่มทั้งหมด
static var _random = new Random();
static var _diceface = _rnd.nextInt(6) +1 ;
ตอนนี้สร้างวิดเจ็ตการตรวจจับท่าทางด้วย ClipRRect เป็นลูกเพื่อส่งคืนหนึ่งในหกภาพหน้าลูกเต๋าไปที่หน้าจอเมื่อแตะ
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,
),
)
),
หมายเลขสุ่มใหม่จะถูกสร้างขึ้นทุกครั้งที่คุณแตะหน้าจอและหมายเลขนั้นจะถูกอ้างอิงเพื่อเลือกว่าจะเลือกภาพหน้าลูกเต๋าใด
ฉันหวังว่าตัวอย่างนี้จะช่วยได้ :)