Dart에서 난수를 어떻게 생성합니까?


127

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
카이 Sellgren

답변:


179

사용 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.
Tower

음의 난수 (복수)는 어떻습니까? 예를 들어 -0.8에서 0.9까지 생성하는 randomRange 메서드를 구현하려고합니다. 결과는 예를 들어 -0.32
just_a_dude

2
@just_a_dude는 stackoverflow에 대한 완벽한 질문처럼 들립니다. :) 새 질문을 만드는 것이 좋습니다
세스 래드

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을 의미합니다. 이 당신도 1,7에 의해 miltiplied 오히려 이중 0-1, nextInt를 사용하지만처럼 사용할 수있는 더 많은 옵션이 있고 -0.8 이동
Veljac

28

라이브러리에 있는 Randomobject 클래스 를 통해이를 달성 할 수 있습니다 . 이 방법에는 최대 제한이 필요합니다. 난수는에서 시작 하고 최대 제한 자체는 배타적입니다.random.nextInt(max)dart:mathnextInt()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까지의 숫자가 포함되어 있지 않습니까?
Tim

@Tim 주목 해 주셔서 감사합니다. 방금 이전 줄에서 코드를 복사했습니다. 해결했습니다.
Samir Rahimy

17

당신이 필요로하는 경우 암호 보안이 임의의 숫자 (예 : 암호화), 당신은 브라우저에있어, 당신은 사용할 수 있습니다 DOM의 암호화 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));
}

그러면 0에서 99 (포함)까지의 12 개 정수 목록이 생성됩니다.


9

보안 임의 API가 방금 추가되었습니다. dart:math

new Random.secure()

dart:math Randomsecure생성 된 모든 임의 값에 대해 임 베더가 제공 한 엔트로피 소스에서 읽는 암호화 보안 난수 생성기를 반환 하는 생성자를 추가했습니다 .

window.crypto.getRandomValues()브라우저와 OS ( 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에서 기대할 수있는 친숙한 인터페이스를 제공하며 mono의 Random.cs에서 포팅되었습니다. 이 코드는 암호화 안전하지 않을 수 있으며 통계적으로 테스트되지 않았습니다.


나는 전에 DRandom을 사용했습니다. 좋은 lib!
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);

그런 다음 이와 같이 사용하여 하한과 상한 사이에 생성 된 1000 개의 숫자 집합의 평균을 확인할 수 있습니다. 값은 인스턴스화 후 액세스 할 수 있도록 클래스에 저장됩니다.

_swarmii



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

탭하면 6 개의 주사위 얼굴 이미지 중 1 개를 무작위로 화면에 호출하는 간단한 주사위 굴리기 앱 형태의 실용적인 예를 들어이 질문을 해결하겠습니다.

먼저 난수를 생성하는 변수를 선언하십시오 (dart.math를 가져 오는 것을 잊지 마십시오). 그런 다음 1과 6 사이의 제약 조건 내에서 초기 난수를 Integer로 구문 분석하는 변수를 선언합니다.

두 변수는 모두 한 번 초기화되기 위해 정적 전용입니다. 이는 큰 문제는 아니지만 전체 난수를 초기화해야하는 경우 좋은 방법입니다.

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

이제 ClipRRect를 자녀로 사용하여 제스처 감지 위젯을 만들어 6 개의 주사위 얼굴 이미지 중 하나를 탭하면 화면에 반환합니다.

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.