আমি কীভাবে ডার্টে এলোমেলো সংখ্যা তৈরি করব?


126

আমি কীভাবে ডার্ট ব্যবহার করে এলোমেলো সংখ্যা তৈরি করব?


4
আপনি কীভাবে জানেন যে তারা খারাপ নম্বর? এলোমেলো জিনিসটি হ'ল আপনি সত্যই বলতে পারবেন না ... i46.tinypic.com/2vw7237.gif
corsiKa

2
বিশ্বাস করুন, আপনি যদি ডার্ট: কোর ম্যাথ ব্যবহার করেন তবে সেগুলি খারাপ bad :) এই বাগটি এখানে রয়েছে: code.google.com/p/dart/issues/detail?id=499
শেঠ

3
আপনি যদি এলোমেলো নম্বরগুলি খারাপ কিনা তা জানতে চাইলে আমার চিস্কুয়ার লাইব্রেরিটি ব্যবহার করুন: github.com/kaisellgren/ChiSquare
Kai Sellgren

উত্তর:


178

Randomথেকে ক্লাস ব্যবহার করুন dart:math:

import 'dart:math';

main() {
  var rng = new Random();
  for (var i = 0; i < 10; i++) {
    print(rng.nextInt(100));
  }
}

এই লেখার সময় হিসাবে এই কোডটি ডার্ট ভিএম এবং ডার্ট 2 জেসের সাথে পরীক্ষিত হয়েছিল।


1
আপনি যদি ক্রিপ্টোগ্রাফিকভাবে শক্তিশালী এলোমেলো সংখ্যা চান তবে ক্লাসের /dev/urandomসাথে পড়া ভাল File
টাওয়ার

নেতিবাচক এলোমেলো সংখ্যা (দ্বিগুণ) সম্পর্কে কীভাবে? আমি একটি র্যান্ডমরেঞ্জ পদ্ধতি প্রয়োগ করার চেষ্টা করছি যা উদাহরণস্বরূপ -0.8 থেকে 0.9 পর্যন্ত উত্পন্ন হবে ... ফলাফলটি উদাহরণস্বরূপ -0.32 হবে
just_a_dude

2
@just_a_dude যা স্ট্যাকওভারফ্লোয়ের জন্য নিখুঁত প্রশ্নের মতো মনে হচ্ছে। একটি নতুন প্রশ্ন তৈরি করা বিবেচনা করুন :)
শেঠ লাড

1
উদাহরণটি -0.8 থেকে 0.9 পর্যন্ত উত্পন্ন করার পদ্ধতিটি সহজ। আপনার কেবল মান মানচিত্রের প্রয়োজন। আপনার পরিসীমা 0.8 + 0.9 = 1,7। সুতরাং আপনি যদি rng.nextInt (1700) রাখেন তবে আপনি 0 এবং 1700 এর মধ্যে নম্বর পাবেন by 100 দ্বারা ভাগ করুন এবং -0,8 হ্রাস করুন। অর্থ আপনার রেন্ড = rng.nextInt (1700) / 100.0-0.8। আপনি আরও কিছু বিকল্প ব্যবহার করতে পারেন যেমন পরের আইটিও ব্যবহার না করে বরং ডাবল 0-1, দ্বিগুণ করে 1,7 এবং শিফট করা হয়েছে
-০.৮

26

আপনি এটি 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 পর্যন্ত সংখ্যা অন্তর্ভুক্ত করা হয়নি?
টিম

@ টিম লক্ষ্য করার জন্য ধন্যবাদ, আমি কেবল পূর্ববর্তী লাইন থেকে কোডটি অনুলিপি করেছি। সমাধান করেছেন।
সমীর রহিমি

17

আপনার যদি ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত র্যান্ডম সংখ্যার প্রয়োজন হয় (যেমন এনক্রিপশনের জন্য) এবং আপনি একটি ব্রাউজারে থাকেন তবে আপনি ডম ক্রিপ্টোগ্রাফি এপিআই ব্যবহার করতে পারেন :

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

এটি ডারটিয়াম, ক্রোম এবং ফায়ারফক্সে কাজ করে, তবে সম্ভবত এটি অন্যান্য পরীক্ষামূলক এপিআই হিসাবে অন্যান্য ব্রাউজারগুলিতে নেই।


17

এলোমেলো সংখ্যার একটি তালিকা তৈরি করার জন্য এখানে একটি স্নিপেট

import 'dart:math';

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

এটি 0 থেকে 99 (অন্তর্ভুক্ত) পর্যন্ত 12 পূর্ণসংখ্যার একটি তালিকা তৈরি করবে।


9

একটি সুরক্ষিত এলোমেলো এপিআই সবেমাত্র যুক্ত করা হয়েছে dart:math

new Random.secure()

dart:math Randomsecureএকটি ক্রিপ্টোগ্রাফিক সুরক্ষিত র্যান্ডম জেনারেটর ফেরত এমন একজন কন্সট্রাক্টর যুক্ত করেছেন যা প্রতিটি উত্পন্ন এলোমেলো মানের জন্য এম্বেডারের দ্বারা সরবরাহ করা এনট্রপি উত্স থেকে পড়ে।

যা window.crypto.getRandomValues()ব্রাউজারে এবং ওএসে প্রতিনিধি দেয় ( urandomসার্ভারের মতো)


এই নতুন এপিআইটি 1.14-দেব বা তার চেয়েও বড়তে উপলব্ধ।
শেঠ লাড

7

মন্তব্য করতে সক্ষম হচ্ছি না কারণ আমি এই অ্যাকাউন্টটি তৈরি করেছি, তবে আমি নিশ্চিত করতে চেয়েছিলাম যে @ Egrobot78 এর সমাধান কাজ করে তবে এটি ডার্টে একচেটিয়া তাই এটি শেষ সংখ্যাটি অন্তর্ভুক্ত করে না। আপনি যদি শেষ লাইনটি "r = min + rnd.nextInt (সর্বাধিক - মিনিট + 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- এ কী প্রত্যাশা করবেন এটি একটি পরিচিত ইন্টারফেস সরবরাহ করে, এটি মনোর র্যান্ডম.cs থেকে পোর্ট করা হয়েছিল। এই কোডটি ক্রিপ্টোগ্রাফি নিরাপদ না হতে পারে এবং পরিসংখ্যানগতভাবে পরীক্ষা করা হয়নি।


আমি এর আগে ড্র্যান্ডম ব্যবহার করেছি। শুভ কামনা!
জন ইভান্স

3

সাধারণ উত্পন্ন করার জন্য এই ছোট্ট ক্লাসটি লিখেছেন মাত্র র্যান্ডম সংখ্যা ... আমার যা যা করা দরকার তা চেক করার জন্য এটি শালীন সূচনা পয়েন্ট ছিল। (এই সেটগুলি একটি "বেল" আকৃতির বক্ররেখা বিতরণ করবে The) বীজ এলোমেলোভাবে সেট করা হবে তবে আপনি যদি একটি সেট পুনরায় উত্পন্ন করতে সক্ষম হতে চান তবে আপনি কিছু নির্দিষ্ট বীজ পাস করতে পারবেন এবং একই সেটটি উত্পন্ন করবে।

আনন্দ কর...

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

এই লাইব্রেরিটি ব্যবহার করুন http://dart.googlecode.com/svn/branches/bleeding_edge/dart/lib/math/random.dart একটি ভাল র্যান্ডম জেনারেটর সরবরাহ করেছে যা আমি মনে করি যে এসডিকে অন্তর্ভুক্ত করা হবে শীঘ্রই আশা করি এটি সাহায্য করে


এটি এখন এসডিকে। এটি কীভাবে ব্যবহার করতে হয় তার জন্য আমার উত্তরটি দেখুন।
শেঠ লাড

1

আমার পক্ষে সবচেয়ে সহজ উপায় হল:

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

এখানে @ অ্যাডাম-গায়িকারের ব্যাখ্যার জন্য ধন্যবাদ


1

এটা আমার জন্য কাজ করেছে new Random().nextInt(100); // MAX = number

এটি 0 থেকে 99 এলোমেলো নম্বর দেবে

Eample ::

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

0

আমি এই প্রশ্নটি একটি সাধারণ ডাইস রোলিং অ্যাপ্লিকেশনটির মতো ব্যবহারিক উদাহরণ দিয়ে সমাধান করতে দিন যা টেপযুক্ত অবস্থায় এলোমেলোভাবে 6 ডাইস মুখের চিত্রগুলিকে স্ক্রিনে কল করে।

প্রথমে এমন একটি ভেরিয়েবল ঘোষণা করুন যা এলোমেলো সংখ্যা উত্পন্ন করে (dart.math আমদানি করতে ভুলবেন না)। তারপরে এমন একটি ভেরিয়েবল ঘোষণা করুন যা প্রাথমিক র্যান্ডম সংখ্যাটিকে 1 এবং 6 এর মধ্যে একটি পূর্ণসংখ্যা হিসাবে অন্তর্ভুক্ত করে within

একবারে আরম্ভ করার জন্য উভয় ভেরিয়েবল স্থিতিশীল ব্যক্তিগত। এটি কোনও বিশাল চুক্তি নয় তবে আপনাকে যদি এলোমেলো সংখ্যার পুরো গোছা শুরু করতে হয় তবে এটি ভাল অনুশীলন হবে।

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

বাচ্চা হিসাবে ক্লিপআররেট সহ একটি অঙ্গভঙ্গি সনাক্তকরণ উইজেট তৈরি করুন যখন ছয়টি ডাইস ফেস ইমেজগুলির মধ্যে একটি টেপযুক্ত হয় তখন স্ক্রিনে ফিরে আসুন।

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.