program story

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

inputbox 2020. 10. 19. 08:02
반응형

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로 테스트되었습니다.


암호화 된 보안 난수 가 필요 하고 (예 : 암호화 용) 브라우저를 사용하는 경우 DOM 암호화 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));
}

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


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

new Random.secure()

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

window.crypto.getRandomValues()브라우저와 OS ( urandom서버에서 와 같이) 위임


대체 솔루션은 다음 코드 DRandom을 사용할 수 있습니다 . 이 클래스는 시드와 함께 사용해야합니다. .NET에서 기대할 수있는 친숙한 인터페이스를 제공하며 mono의 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);

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

_swarmii


이 라이브러리를 사용 하십시오. http://dart.googlecode.com/svn/branches/bleeding_edge/dart/lib/math/random.dart 는 곧 sdk에 포함될 것이라고 생각하는 좋은 임의 생성기를 제공했습니다.

참고URL : https://stackoverflow.com/questions/11674820/how-do-i-generate-random-numbers-in-dart

반응형