2013-03-23 38 views
6

Tôi hiểu làm thế nào để tạo ra một số ngẫu nhiên mà là giữa hai con số:Tạo một số ngẫu nhiên giữa nhiều khoảng

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

hoặc

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

Nhưng làm thế nào để tôi đi về tạo ra một số ngẫu nhiên mà rơi vào nhiều phạm vi?

Ví dụ: Số có thể là từ 1 đến 10 hoặc giữa 50-60

Trả lời

5

Tôi muốn đi với một cái gì đó như thế này, để cho phép bạn làm điều đó với càng nhiều dãy như bạn muốn:

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

Fine cho phạm vi được yêu cầu, nhưng có thể không thực tế đối với các phạm vi có quá nhiều số. – Javier

+0

Công trình này tuyệt vời! Mặc dù tôi không thực sự có bất kỳ đầu mối nào về cách thức hoạt động của nó. –

+0

@KarloDelalic Về cơ bản, nó chỉ tạo một danh sách tất cả các số nằm trong dãy bạn đưa ra, sau đó chọn một số ngẫu nhiên từ danh sách đó, do đó là một số ngẫu nhiên từ bất kỳ phạm vi nào. – MrLore

2

Đầu tiên tạo ra một số nguyên từ 1 đến 20. Sau đó, nếu giá trị là trên 10, bản đồ đến khoảng thứ hai.

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

Trước tiên, bạn cần phải biết có bao nhiêu số trong mỗi phạm vi . (Tôi giả sử bạn đang chọn số nguyên từ một phạm vi riêng biệt, không phải giá trị thực từ một phạm vi liên tục.) Trong ví dụ của bạn, có 10 số nguyên trong phạm vi đầu tiên và 11 trong số thứ nguyên. Điều này có nghĩa là 10/21 lần, bạn nên chọn từ phạm vi đầu tiên và 11/21 lần chọn từ lần thứ hai. Trong mã giả

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

Các phạm vi này có thể dễ dàng được thay thế bằng các biến. Và tính tổng số các số trong tất cả các phạm vi sử dụng các biến. – Halfacht

0

nếu danh sách được biết là tôi nghĩ bạn có thể sử dụng cái gì như thế này.

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

Làm thế nào về phương pháp sau đây: ngẫu nhiên chọn một loạt việc sử dụng mà dao động để generage số ngẫu nhiên của bạn, cho rằng bạn sẽ phải đặt dãy bạn trong một số danh sách hoặc mảng

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; 
    } 
} 
Các vấn đề liên quan