ฉันจะสร้างตัวเลขสุ่มใน Dart ได้อย่างไร


128

ฉันจะสร้างตัวเลขสุ่มโดยใช้ Dart ได้อย่างไร


4
คุณรู้ได้อย่างไรว่าเป็นตัวเลขที่ไม่ดี? สิ่งที่เกี่ยวกับการสุ่มนั้นคุณไม่มีทางบอกได้เลยว่า ... i46.tinypic.com/2vw7237.gif
corsiKa

2
เชื่อฉันคุณจะรู้ว่าพวกเขาไม่ดีถ้าคุณใช้ dart: core Math :) นี่คือจุดบกพร่อง: code.google.com/p/dart/issues/detail?id=499
Seth Ladd

3
หากคุณต้องการทราบว่าตัวเลขสุ่มของคุณไม่ถูกต้องหรือไม่ให้ใช้ห้องสมุด ChiSquare ของฉันเพื่อค้นหา: github.com/kaisellgren/ChiSquare
Kai Sellgren

คำตอบ:


180

ใช้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 ณ เวลาที่เขียนนี้


1
คุณควรอ่าน/dev/urandomกับFileชั้นเรียนนี้ดีกว่าถ้าคุณต้องการตัวเลขสุ่มที่มีการเข้ารหัสที่แข็งแกร่ง
ทาวเวอร์

แล้วตัวเลขสุ่มเชิงลบ (คู่) ล่ะ? ฉันกำลังพยายามใช้เมธอด randomRange ที่จะสร้างตัวอย่างเช่นจาก -0.8 ถึง 0.9 ... ผลลัพธ์จะเป็นเช่น -0.32
just_a_dude

2
@just_a_dude ซึ่งดูเหมือนเป็นคำถามที่สมบูรณ์แบบสำหรับ stackoverflow ลองสร้างคำถามใหม่ :)
Seth Ladd

1
วิธีที่จะสร้างตัวอย่างเช่นจาก -0.8 ถึง 0.9 นั้นง่ายมาก คุณต้องจับคู่ค่า ช่วงของคุณคือ 0.8 + 0.9 = 1,7 ดังนั้นถ้าคุณใส่ rng.nextInt (1700) คุณจะได้ตัวเลขระหว่าง 0 ถึง 1700 หารด้วย 100 และลด -0,8 หมายถึง yourRnd = rng.nextInt (1700) /100.0-0.8 มีตัวเลือกเพิ่มเติมที่คุณสามารถใช้ได้เช่นไม่ได้ใช้ nextInt แต่จะเป็น 0-1 สองเท่า, miltiplied โดย 1,7 และเลื่อน -0.8
Veljac

28

คุณสามารถบรรลุได้ผ่าน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

คำตอบของคุณไม่รวมตัวเลขตั้งแต่ 10 ถึง 109 หรือ?
ทิม

@ ทิมขอบคุณที่สังเกตเห็นฉันเพิ่งคัดลอกรหัสจากบรรทัดก่อนหน้านี้ แก้ไขได้แล้ว
Samir Rahimy

17

หากคุณต้องการตัวเลขสุ่มที่ปลอดภัยในการเข้ารหัส (เช่นสำหรับการเข้ารหัส) และคุณอยู่ในเบราว์เซอร์คุณสามารถใช้DOM cryptography API :

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

ใช้งานได้ใน Dartium, Chrome และ Firefox แต่อาจจะไม่ใช้ในเบราว์เซอร์อื่นเนื่องจากเป็น API ทดลอง


17

นี่คือตัวอย่างข้อมูลสำหรับสร้างรายการตัวเลขสุ่ม

import 'dart:math';

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

สิ่งนี้จะสร้างรายการของจำนวนเต็ม 12 จำนวนตั้งแต่ 0 ถึง 99 (รวม)


9

เพิ่งเพิ่ม API แบบสุ่มที่ปลอดภัยลงใน dart:math

new Random.secure()

dart:math Randomเพิ่มตัวsecureสร้างที่ส่งคืนเครื่องกำเนิดไฟฟ้าแบบสุ่มที่มีการเข้ารหัสที่ปลอดภัยซึ่งอ่านจากแหล่งเอนโทรปีที่จัดเตรียมโดยโปรแกรมฝังสำหรับทุกค่าสุ่มที่สร้างขึ้น

ซึ่งมอบหมายให้window.crypto.getRandomValues()ในเบราว์เซอร์และระบบปฏิบัติการ (เช่นurandomบนเซิร์ฟเวอร์)


API ใหม่นี้พร้อมใช้งานในเวอร์ชัน 1.14-dev หรือสูงกว่า
Seth Ladd

7

ไม่สามารถแสดงความคิดเห็นได้เนื่องจากฉันเพิ่งสร้างบัญชีนี้ แต่ฉันต้องการให้แน่ใจว่าวิธีการแก้ปัญหาของ @ 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

4

ลองทำเช่นนี้คุณสามารถควบคุมค่าต่ำสุด / สูงสุด:

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

วิธีการแก้ปัญหาทางเลือกที่อาจจะมีการใช้รหัสต่อไปนี้DRandom ชั้นนี้ควรใช้กับเมล็ดพันธุ์ มันมีอินเทอร์เฟซที่คุ้นเคยกับสิ่งที่คุณคาดหวังใน. NET ซึ่งถูกย้ายมาจาก Random.cs ของโมโน รหัสนี้อาจไม่ปลอดภัยในการเข้ารหัสและยังไม่ได้รับการทดสอบทางสถิติ


ฉันเคยใช้ DRandom มาก่อน ดีมาก!
John Evans

3

เพิ่งเขียนคลาสเล็ก ๆ นี้เพื่อสร้างตัวเลขสุ่มปกติ ... มันเป็นจุดเริ่มต้นที่ดีสำหรับการตรวจสอบที่ฉันต้องทำ (ชุดเหล่านี้จะกระจายบนเส้นโค้งรูป "ระฆัง") เมล็ดพันธุ์จะถูกตั้งค่าแบบสุ่ม แต่ถ้าคุณต้องการสร้างชุดขึ้นมาใหม่คุณก็สามารถส่งเมล็ดพันธุ์ที่เฉพาะเจาะจงไปได้และชุดเดียวกันจะสร้างขึ้น

มีความสุข...

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


1

ใช้ไลบรารีนี้http://dart.googlecode.com/svn/branches/bleeding_edge/dart/lib/math/random.dartให้เครื่องกำเนิดไฟฟ้าแบบสุ่มที่ดีซึ่งฉันคิดว่าจะรวมอยู่ใน sdk ในไม่ช้าหวังว่าจะช่วยได้


ตอนนี้อยู่ใน SDK ดูคำตอบของฉันด้านบนสำหรับวิธีการใช้งาน
Seth Ladd

1

สำหรับฉันวิธีที่ง่ายที่สุดคือทำ:

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

ขอบคุณคำอธิบายของ @ adam-singer ที่นี่


1

มันใช้ได้ผลสำหรับฉัน new Random().nextInt(100); // MAX = number

จะให้หมายเลขสุ่ม 0 ถึง 99

Eample ::

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

0

ให้ฉันไขคำถามนี้ด้วยตัวอย่างที่ใช้ได้จริงในรูปแบบของแอพทอยลูกเต๋าแบบง่ายๆที่เรียก 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,
              ),
          )
        ),

หมายเลขสุ่มใหม่จะถูกสร้างขึ้นทุกครั้งที่คุณแตะหน้าจอและหมายเลขนั้นจะถูกอ้างอิงเพื่อเลือกว่าจะเลือกภาพหน้าลูกเต๋าใด

ฉันหวังว่าตัวอย่างนี้จะช่วยได้ :)

แอพทอยลูกเต๋าโดยใช้ตัวเลขสุ่มในโผ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.