2013-03-23 29 views
6

rozumiem jak zrobić liczbę losową, która jest między dwoma numerami:Generowanie liczb losowych między wieloma waha

1 + (int)(Math.random() * ((10 - 1) + 1)) 

lub

Min + (int)(Math.random() * ((Max - Min) + 1)) 

Ale jak mogę iść o generowanie liczb losowych, które mieści się w wielu zakresach?

Na przykład ilość może wynosić od 1 do 10 lub od 50 do 60

Odpowiedz

5

pójdę z czymś takim, co pozwala zrobić to z jak wielu zakresach, jak chcesz:

import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 

class RandomInRanges 
{ 
    private final List<Integer> range = new ArrayList<>(); 

    RandomInRanges(int min, int max) 
    { 
     this.addRange(min, max); 
    } 

    final void addRange(int min, int max) 
    { 
     for(int i = min; i <= max; i++) 
     { 
      this.range.add(i); 
     } 
    } 

    int getRandom() 
    { 
     return this.range.get(new Random().nextInt(this.range.size())); 
    } 

    public static void main(String[] args) 
    { 
     RandomInRanges rir = new RandomInRanges(1, 10); 
     rir.addRange(50, 60); 
     System.out.println(rir.getRandom()); 
    } 
} 
+0

grzywnę za żądane zakresy, ale prawdopodobnie niepraktyczne dla zakresów o zbyt dużej liczbie. – Javier

+0

Działa to świetnie! Chociaż tak naprawdę nie mam pojęcia, jak to działa. –

+0

@KarloDelalic Zasadniczo tworzy listę wszystkich liczb znajdujących się w zakresach, które podajesz, a następnie wybiera losową liczbę z tej listy, która jest zatem liczbą losową z dowolnego z zakresów. – MrLore

2

najpierw generuje liczbę całkowitą między 1 i 20. Następnie, gdy wartość powyżej 10, odwzorowane na drugim przedziale.

Random random = new Random(); 

for (int i=0;i<100;i++) { 
    int r = 1 + random.nextInt(60-50+10-1); 
    if (r>10) r+=(50-10); 
    System.out.println(r);  
} 
2

Po pierwsze, trzeba wiedzieć, ile numerów są w każdym zakresie . (Zakładam, że wybierasz liczby całkowite z dyskretnego zakresu, a nie rzeczywiste wartości z zakresu ciągłego.) W twoim przykładzie, jest 10 liczb całkowitych w pierwszym zakresie, a 11 w drugim. Oznacza to, że 10/21 razy, powinieneś wybrać z pierwszego zakresu i 11/21 razy wybrać z drugiego. W pseudokodzie

x = random(1,21) 
if x in 1..10 
    return random(1,10) 
else 
    return random(50,60) 
+0

Te zakresy można łatwo zastąpić zmiennymi. I obliczyć całkowitą liczbę liczb we wszystkich zakresach za pomocą zmiennych. – Halfacht

0

jeśli lista jest znana Myślę, że możesz użyć czegoś takiego.

public class Test 
{ 
    public static void main(String[] args) 
    { 
     int a; 
     for(int i=0;i<10;i++) 
     { 
      a=(int) (Math.random()*((10-0)+(60-50))); 

      if(a<=10) 
      { 

      } 
      else if(a>(60-50)) 
      { 
       a=a+50; 
     } 
      System.out.println(a); 
     } 
    } 
} 
0

Jak o następujące podejście: losowo wybierając zakres jest wykorzystanie tego zakresu do generage swoją liczbę losową, na które trzeba będzie umieścić swoje zakresy w jakiejś listy lub tablicy

public class RandomRangeGenerator { 

    class Range { 
     public int min, max; 
     public Range(int min, int max) { this.min = min; this.max = max; } 
    } 

    @Test 
    public void generate() { 
     List<Range> ranges = new ArrayList<>(); 
     ranges.add(new Range(1, 10)); 
     ranges.add(new Range(50, 60)); 
     List<Integer> randomNumbers = generateRandomNumbers(ranges, 10); 
     System.out.println(randomNumbers.toString()); 
     for(Integer i : randomNumbers) { 
      Assert.assertTrue((i >= 1 && i <= 10) || (i >= 50 && i <= 60)); 
     } 
    } 

    private List<Integer> generateRandomNumbers(List<Range> ranges, int numberOfNumbers) { 
     List<Integer> randomNumbers = new ArrayList<>(numberOfNumbers+1); 
     while(numberOfNumbers-- > 0) { 
      Range range = ranges.get(new Random().nextInt(ranges.size())); 
      randomNumbers.add(range.min + (int)(Math.random() * ((range.max - range.min) + 1))); 
     } 
     return randomNumbers; 
    } 
} 
Powiązane problemy