একটি পরিসীমা এলোমেলো ডাবল উত্পন্ন


143

আমার নীচের মত দুটি ডাবল আছে

double min = 100;
double max = 101;

এবং একটি এলোমেলো জেনারেটর সহ, আমার ন্যূনতম এবং সর্বাধিকের ব্যাপ্তির মধ্যে দ্বিগুণ মান তৈরি করতে হবে।

Random r = new Random();
r.nextDouble();

তবে এখানে এমন কিছু নেই যেখানে আমরা ব্যাপ্তিটি নির্দিষ্ট করতে পারি।

উত্তর:


237

rangeMinএবং এর মধ্যে একটি এলোমেলো মান উত্পন্ন করতে rangeMax:

Random r = new Random();
double randomValue = rangeMin + (rangeMax - rangeMin) * r.nextDouble();

21
এটি সাধারণত সঠিক, তবে এর সীমা থেকে সাবধান থাকুন। আপনি যদি করেন double rangeMax= Double.MAX_VALUE;এবং double rangeMin= -rangeMax;আপনি সর্বদা বিনিময়ে একটি অসীম মান পাবেন। আপনি জন্য পরীক্ষা করতে চাইতে পারেন Double.valueOf(rangeMax-rangeMin).isInfinite()
lre

নোট করুন যে এর ফলাফলগুলি প্রায়শই পছন্দসই পরিসরে অনেকগুলি দ্বিগুণ মান বাদ দেয়, যদি এই পরিসরটি 0.0-1.0 এর চেয়ে বড় হয়। যদি পছন্দসই পরিসীমাটিতে 0.0-1.0 রেঞ্জের চেয়ে বড় সংখ্যার মান থাকে তবে তাদের প্রত্যেকের জন্য কোনও মান থাকবে না এবং সেগুলি কখনই উত্পন্ন হবে না। (কবুতর নীতি দ্বারা!)। কারণ এই তুনাকির সমাধান আরও ভাল।
লিই

@ লিআই তাদের প্রত্যেকের জন্য মূল্য থাকবে না কেন?
কার্তিক চুগ

1
@ কে_7: উদাহরণস্বরূপ বলুন যে 0.0 এবং 1.0 এর মধ্যে 10,000 টি স্বতন্ত্র ডাবল মান রয়েছে (বাস্তবে সম্ভবত আরও বেশি আছে)। তবে এর মধ্যে rangeMinএবং এর ব্যাপ্তি যদি rangeMaxবড় হয় তবে তাদের মধ্যে 10,000,000 স্বতন্ত্র দ্বৈত মান থাকতে পারে। এর ফলাফল (rangeMax - rangeMin) * r.nextDouble()কেবলমাত্র 10,000,000 এর সম্ভাব্য 10,000 টির মধ্যে পছন্দ করবে। (আমি অনুভব করি যে এটি একটি নিখুঁত ব্যাখ্যা নয়, তবে এটি সম্ভবত কিছুটা সাহায্য করে ...)
লিই

1
আহ আমি দেখি. মূলত, এমন একটি সংখ্যাকে গুণিত করা যায় যা মানগুলির একটি সীমাবদ্ধ সেট নিতে পারে সে সেটটির আকার পরিবর্তন করে না।
কার্তিক চুগ

138

এই প্রশ্নটি জাভা 7 মুক্তির আগে জিজ্ঞাসা করা হয়েছিল তবে এখন, জাভা 7 (এবং উপরে) এপিআই ব্যবহার করার আরও একটি সম্ভাব্য উপায় রয়েছে:

double random = ThreadLocalRandom.current().nextDouble(min, max);

nextDoubleসর্বনিম্ন (অন্তর্ভুক্ত) এবং সর্বাধিক (একচেটিয়া) মধ্যে সিউডোরডম ডাবল মান প্রদান করবে। সীমানা অগত্যা হয় না int, এবং হতে পারে double


6
কলটির জন্য এপিআই 21
জার ই আহমের

2
@ XarEAhmer কি এপিআই 21?
অভিজিৎ সরকার

দেখে মনে হচ্ছে তিনি অ্যান্ড্রয়েডের কথা উল্লেখ করছেন।
কার্তিক চুগ

40

এটা ব্যবহার কর:

double start = 400;
double end = 402;
double random = new Random().nextDouble();
double result = start + (random * (end - start));
System.out.println(result);

সম্পাদনা করুন:

new Random().nextDouble(): এলোমেলোভাবে 0 এবং 1 এর মধ্যে একটি সংখ্যা উত্পন্ন করে।

start: নম্বরটি শুরু করতে, "ডানদিকে" নাম্বার স্থানান্তর করতে

end - start: অন্তর. এলোমেলোভাবে আপনাকে এই সংখ্যার 0% থেকে 100% পর্যন্ত দেয় কারণ র্যান্ডম আপনাকে 0 থেকে 1 পর্যন্ত একটি নম্বর দেয়।


সম্পাদনা 2: @ ডানিয়েল এবং @ আআআআআ বি বি টিএসকে টিক্স দিন। আমার প্রথম উত্তরটি ভুল ছিল।


4
import java.util.Random;

public class MyClass {
     public static void main(String args[]) {
          Double min = 0.0;  // Set To Your Desired Min Value
          Double max = 10.0; // Set To Your Desired Max Value
          double x = (Math.random() * ((max - min) + 1)) + min;   // This Will Create A Random Number Inbetween Your Min And Max.
          double xrounded = Math.round(x * 100.0) / 100.0;   // Creates Answer To The Nearest 100 th, You Can Modify This To Change How It Rounds.
          System.out.println(xrounded);    // This Will Now Print Out The Rounded, Random Number.
     }
}

0
Random random = new Random();
double percent = 10.0; //10.0%
if (random.nextDouble() * 100D < percent) {
    //do
}

0

এলোমেলো মূল ধারণাটি এটি একটি সিউডোর্যান্ডম মান প্রদান করে। সম্পূর্ণরূপে এলোমেলো ক্রিয়াকলাপের মতো কোনও জিনিস নেই, সুতরাং, একই বীজ ব্যবহার করে 2 এলোমেলো উদাহরণগুলি নির্দিষ্ট পরিস্থিতিতে একই মান প্রদান করবে।

ফাংশন ডকটি বোঝার জন্য প্রথমে এটি দেখতে একটি ভাল অনুশীলন ( https://docs.oracle.com/javase/8/docs/api/java/util/Random.html )

এখন আমরা বুঝতে পেরেছি যে নেক্সটডুবল () ফাংশনের ফিরে আসা মানটি 0.0 এবং 1.0 এর মধ্যে একটি সিউডোরান্ডম মান যা আমরা এটি আমাদের সুবিধার জন্য ব্যবহার করতে পারি।

এ এবং বি জিভিনের মধ্যে একটি এলোমেলো সংখ্যা তৈরি করার জন্য যে সীমানাটি বৈধ (এ> বি) আমাদের প্রয়োজন: 1. ক এবং বি এর মধ্যে সীমাটি সন্ধান করুন যাতে আমরা জানতে পারি যে আমাদের কতগুলি "পদক্ষেপ" রয়েছে। ২. কতগুলি পদক্ষেপ নিতে হবে তা নির্ধারণ করতে এলোমেলো ফাংশনটি ব্যবহার করুন (কারণ প্রত্যাবর্তিত মান 0.0 এবং 1.0 এর মধ্যে হয় তবে আপনি এটিকে "বর্ধনের একটি এলোমেলো শতাংশ বেছে নিন" হিসাবে ভাবতে পারেন 3.. অফসেট যুক্ত করুন

এত কিছুর পরেও, আপনি দেখতে পাচ্ছেন যে ভিড়টি আপনাকে আমার মতে এটি করার সবচেয়ে সহজ এবং সর্বাধিক সাধারণ উপায় দিয়েছে

ডাবল র্যান্ডমভ্যালু = রেঞ্জমিন + (রেঞ্জম্যাক্স - রেঞ্জমিন) * r.nextDouble ();

ডাবল র্যান্ডমভ্যালু = অফসেট + (ব্যাপ্তি) * (0.0-1.0 এর মধ্যে র্যান্ডমভাল)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.