एक श्रेणी में एक यादृच्छिक डबल उत्पन्न करें


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 की तुलना में बड़ी संख्या में मान हैं, तो उनमें से प्रत्येक के लिए कोई मान नहीं होगा और वे कभी उत्पन्न नहीं होंगे। (कबूतर सिद्धांत द्वारा!)। इस वजह से तुनकी का हल बेहतर है।
Lii

@Lii उनमें से प्रत्येक के लिए एक मूल्य नहीं होगा क्यों नहीं?
कार्तिक चुग

1
@ K_7: उदाहरण के लिए कहें कि 0.0 और 1.0 के बीच 10,000 भिन्न दोहरे मूल्य हैं (वास्तव में संभवतः अधिक हैं)। लेकिन अगर बीच की सीमा बड़ी है rangeMinऔर rangeMaxहो सकती है, तो उनके बीच 10,000,000 दोहरे मान हो सकते हैं। का परिणाम (rangeMax - rangeMin) * r.nextDouble()केवल उन संभावित 10,000,000 मूल्यों में से 10,000 का चयन करेगा। (मुझे लगता है कि यह एक सही व्याख्या नहीं है, लेकिन शायद यह थोड़ा मदद करता है ...)
Lii

1
ओह समझा। मूल रूप से, एक संख्या को गुणा करना जो मानों के सीमित सेट को ले सकता है, उस सेट के आकार को नहीं बदलता है।
कार्तिक चुग

138

यह सवाल जावा 7 रिलीज़ से पहले पूछा गया था, लेकिन अब, जावा 7 (और ऊपर) एपीआई का उपयोग करने का एक और संभव तरीका है:

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

nextDoubleन्यूनतम (समावेशी) और अधिकतम (अनन्य) के बीच एक छद्म आयामी दोगुना मूल्य लौटाएगा। सीमाएं जरूरी नहीं हैं int, और हो सकती हैं double


6
कॉल के लिए एपी 21 की आवश्यकता होती है
ज़ार ई अहमर

2
@XarEAhmer क्या है एपीआई 21?
अभिजीत सरकार

ऐसा लगता है कि वह Android की बात कर रहा है।
कार्तिक चुग

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 तक की संख्या प्रदान करता है।


EDIT 2: Tks @daniel और @aaa bbb। मेरा पहला जवाब गलत था।


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 यादृच्छिक उदाहरण कुछ शर्तों में समान मूल्य वापस कर देंगे।

इसे समझने के लिए पहले फंक्शन doc को देखना एक अच्छा अभ्यास है ( https://docs.oracle.com/javase/8/docs/api/java/util/Random.html )

अब जब हम समझते हैं कि फ़ंक्शन का लौटाया गया मान अगलेडॉगल () 0.0 और 1.0 के बीच एक छद्म आयामी मान है तो हम इसे अपने लाभ के लिए उपयोग कर सकते हैं।

A और B givin के बीच एक यादृच्छिक संख्या बनाने के लिए जो सीमाएँ मान्य हैं (A> B) हमें इसकी आवश्यकता है: 1. A और B के बीच की सीमा ज्ञात करें ताकि हम जान सकें कि हमारे पास कितने "चरण" हैं। 2. यादृच्छिक चरणों का उपयोग करके यह निर्धारित करें कि कितने कदम उठाने हैं (क्योंकि लौटाया गया मान 0.0 और 1.0 के बीच है, आप इसके बारे में सोच सकते हैं कि "वृद्धि का एक यादृच्छिक प्रतिशत चुनें" 3. ऑफसेट जोड़ें

उस सब के बाद, आप देख सकते हैं कि भीड़ ने आपको मेरी राय में ऐसा करने का सबसे आसान और सबसे सामान्य तरीका दिया

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

डबल रैंडम वेल = ऑफ़सेट + (रेंज) * (रैंडमवैल के बीच 0.0-1.0)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.