2015-06-10 106 views
1

我正在用Java寫一個MasterMind程序。我的意圖是生成一個4位數字,但所有數字都需要不同。你會如何使用Math.random()?或者,還有更好的方法?如何生成一個不重複的隨機數

例如:這裏

4321 (allowed) 
4341 (not allowed) 
+0

到目前爲止你做了什麼?你可以重複使用'math.random()',直到結果中沒有重複的數字。 – likeitlikeit

+3

習慣上,當問一個問題向我們展示你到目前爲止嘗試過的東西時。解決這個問題是算法制定中的一個簡單練習。如果你試圖自己想出一個方法,你會受益更多。 – scottb

回答

0

使用集合,以確定你已經有這個數字:

import java.util.ArrayList; 

public class MyRandom { 

    public static void main(String[] args) { 
     System.out.println(getRandom(4)); 
     System.out.println(getRandom(4)); 
     System.out.println(getRandom(10)); 
    } 

    public static String getRandom(int length){ 
     if (length>10) return "Hexadecimal?"; 
     ArrayList<Integer> numbers=new ArrayList<Integer>(); 
     while (length>0){ 
      int digit=(int)(Math.random()*10); 
      if (numbers.contains(digit)) continue; 
      numbers.add(digit); 
      length--; 
     } 
     StringBuilder sb=new StringBuilder(); 
     for (Integer integer : numbers) { 
      sb.append(integer); 
     } 
     return sb.toString(); 
    } 
} 
0

真的沒什麼優化,但:

簡單/殘酷的方式將產生由位數字,如您存儲它們,只要你得到一個數字你已經有了,你會生成一個新的隨機數字。

一個更好的解決方案是最初存儲可能的數字(比如說在一個列表中),並且對於每個數字,您將得到一個最大爲列表大小的隨機數(當列表從0開始減1)時,在此位置獲取元素,並從列表中刪除該元素。

實施例:

Possible digits : 123456789 
picks a random element, let's say "3" 
Possible digits : 12456789 

等。

0

可能有很多方法可以解決這個問題,我在下面提供了兩個。

第一招:

使用隨機生成,從1-9到集中添加隨機數字。
設置防止重複,所以繼續發生,直到集合大小4.

第二個:

添加數字1-9到一個ArrayList,使用Collections.shuffle洗牌的數字。
取前4個數字。

注:不使用數字0,以防止0123變成123

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.HashSet; 
import java.util.List; 
import java.util.Random; 
import java.util.Set; 

public class QuickTester { 

    public static void main(String[] args) { 

     for(int i = 0; i < 3; i++) { 
      setRandom(); 
     } 
     for(int i = 0; i < 3; i++) { 
      shuffleRandom(); 
     } 
    } 

    /** 
    * Use a random generator, generate digits from 1-9, 
    * add them to the set (prevents duplicates) until set size is 4 
    */ 
    public static void setRandom() { 
     Random rand = new Random(); 
     Set<Integer> set = new HashSet<Integer>(); 

     while(set.size() < 4) { 
      set.add(rand.nextInt(9)+1); 
     } 

     String numStr = ""; 
     for(Integer n : set) { 
      numStr += n; 
     } 
     int num = Integer.parseInt(numStr); 
     System.out.println(num); 
    } 

    /** 
    * Add digits 1-9 to an ArrayList, shuffle it using Collections.shuffle 
    * Take the first 4 digits 
    */ 
    public static void shuffleRandom() { 
     List<Integer> intList = new ArrayList<Integer>(); 
     for(int i = 1; i < 10; i++) { 
      intList.add(i); 
     } 

     Collections.shuffle(intList); 

     String numStr = ""; 
     for(int i = 0; i < 4; i++) { 
      numStr += intList.get(i); 
     } 
     int num = Integer.parseInt(numStr); 
     System.out.println(num); 
    } 
} 

輸出:

3459 
1359 
2589 
3456 
2198 
2153 
0

所以你想選擇4件事,然後剩下3件,然後剩下2件,現在拿走最後一件。關於如何:

n1 = generator.nextInt(4)+1; 

n2 = generator.nextInt(3)+1; 
if (!n2<n1) {n2 += 1;}//avoid the hole 

n3 = generator.nextInt(2)+1; 
if (!n3<n1) {n3 += 1;}//avoid the holes 
if (!n3<n2) {n2 += 1;} 
1

使用地圖爲您提供了更清晰的代碼和更好的複雜性

public static void main(String[] args) { 
    Set<Integer> fourUniqueRandonNumbers = new HashSet<Integer>() ; 
    int maxItems = 4; 
    StringBuilder flatValueToRetun = new StringBuilder(); 
    while (fourUniqueRandonNumbers.size()<maxItems){    
     int randomNumber = (int)(Math.random() * 9 + 1);   
     if(!fourUniqueRandonNumbers.contains(randomNumber)){ 
      fourUniqueRandonNumbers.add(randomNumber); 
      flatValueToRetun.append(randomNumber); 
     } 
    } 
} 
1

你可以簡單地實現這一點使用方法Collections.shuffle

List<Integer> l = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); 
Collections.shuffle(l); 
Integer result = 1000*l.get(0) + 100*l.get(1) + 10*l.get(2) + l.get(3);