我正在用Java寫一個MasterMind程序。我的意圖是生成一個4位數字,但所有數字都需要不同。你會如何使用Math.random()
?或者,還有更好的方法?如何生成一個不重複的隨機數
例如:這裏
4321 (allowed)
4341 (not allowed)
我正在用Java寫一個MasterMind程序。我的意圖是生成一個4位數字,但所有數字都需要不同。你會如何使用Math.random()
?或者,還有更好的方法?如何生成一個不重複的隨機數
例如:這裏
4321 (allowed)
4341 (not allowed)
使用集合,以確定你已經有這個數字:
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開始減1)時,在此位置獲取元素,並從列表中刪除該元素。
實施例:
Possible digits : 123456789
picks a random element, let's say "3"
Possible digits : 12456789
等。
可能有很多方法可以解決這個問題,我在下面提供了兩個。
第一招:
使用隨機生成,從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
所以你想選擇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;}
使用地圖爲您提供了更清晰的代碼和更好的複雜性
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);
}
}
}
你可以簡單地實現這一點使用方法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);
到目前爲止你做了什麼?你可以重複使用'math.random()',直到結果中沒有重複的數字。 – likeitlikeit
習慣上,當問一個問題向我們展示你到目前爲止嘗試過的東西時。解決這個問題是算法制定中的一個簡單練習。如果你試圖自己想出一個方法,你會受益更多。 – scottb