我有采取隨機INT數隨機選擇INT數
for (int i=1;i<=5;i++) {
int rand= new Random().nextInt(10);
Log.d("Ramdom number", String.valueOf(rand));
}
問題下面的代碼是,我不想重複的隨機數,當我運行這段代碼它給我的5個號碼的意思但其中兩個至少重複。有什麼建議?
我有采取隨機INT數隨機選擇INT數
for (int i=1;i<=5;i++) {
int rand= new Random().nextInt(10);
Log.d("Ramdom number", String.valueOf(rand));
}
問題下面的代碼是,我不想重複的隨機數,當我運行這段代碼它給我的5個號碼的意思但其中兩個至少重複。有什麼建議?
一個小範圍的數字可供選擇,這應該做的伎倆:
ArrayList<Integer> numbers = new ArrayList<Integer>();
for (int i = 0; i < 20; ++i) {
numbers.add(i);
}
Collections.shuffle(numbers);
for (int i = 0; i < 5; ++i) {
Log.d("Random number", numbers.get(i).toString());
}
'Collections.shuffle()'包含在庫存Java安裝附帶的庫中嗎? –
@TonyEnnis:它是Java SE的一部分:http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#shuffle%28java.util.List%29 – reima
謝謝,這就是很高興知道。那麼我最喜歡你的解決方案。 –
問題是你正在循環中創建一個Random對象。如果循環是「緊」的,就像在這種情況下一樣,Random對象將被賦予相同的值。在循環外部移動Random對象初始化應該可以做到。
Random r = new Random();
for (int i=1;i<=5;i++) {
int rand= r.nextInt(10)
Log.d("Ramdom number", String.valueOf(rand));
}
編輯:
這應該工作(至少它爲我做的)
public static Integer[] getRangedInt(int maxRange, int numCount)
{
if (maxRange < numCount)
{
throw new Exception("maxRange cannot be smaller than numCount");
}
Set<Integer set = new HashSet<Integer>();
Random r = new Random();
while (Set.size() < numCount)
{
int random = r.nextInt(maxRange);
while (!set.add(random))
{
random = r.nextInt(maxRange);
}
}
return set.toArray(new Integer[set.size()]);
}
所以你要找的究竟是不是隨機數的列表,這是一個列表隨機排列的30個數字。
一種方法是生成所有可能值的列表,然後對它們進行隨機排序,然後根據需要將它們從列表的前面剝離。下面是一些僞代碼:
for(int i=1; i<=30; i++) {
double r = rand();
while (null != aTreeSet.get(r)) r = rand();
aTreeSet.put(r, i);
}
其中rand()
返回一些隨機值(不是你所尋求的1-30,這是i
)也許是0和1之間aTreeSet
是你在想什麼。
該循環可防止在rand()
返回dup的情況不太可能發生時產生悲傷。
要使用此功能,請按排序順序從aTreeSet
中提取值。
編輯 - 總解決方案
另一種方式是產生1-30值,如果它是不是已經在「我所看到的這個」設置,添加它和返回值。如果它在那裏是,則生成一個新的隨機數。重複,直到發現一個未使用的號碼。相對而言,這在最後幾個值中表現不佳。對於現代處理器上的30個值,當然會以毫秒爲單位完成。如果你的最大值是1000而不是30,我會開始擔心。
如果你想知道一個數字是否已經生成,你必須能夠檢查它,並且需要數據結構。我會發布另一個解決方案,但它很糟糕。 –
您可以保存生成的數字在一組,並使用隨機數只有當它是不是在一套
Random r = new Random();
Set<Integer> generatedNumbers = new HashSet<Integer>();
for(int i = 1;i<=5;i++) {
int rand = r.nextInt(10)
if (!generatedNumbers.contains(rand)) {
Log.d("Ramdom number", String.valueOf(rand));
generatedNumbers.add(rand);
}
}
工作,但不會擴展(雖然OP說最大值只有30)順便說一句,你的代碼有一個錯誤。在副本上,不會打印任何值。所以它不打印dups(thumbsup),但在這種情況下也不會打印5個值。 –
我認爲你需要一組隨機數。這個提示就足夠了。
如果不是,請評論。
可以保持生成的數字
boolean flag=false;
Vector<int> vec = new Vector<int>();
for (int i=1;i<=5;i++) {
flag=false;
int rand= r.nextInt(10);
for(int j=0;j<vec.size();j++)
{
if(vec.get(j)==rand)
{
flag=true;
break;
}
}
if(flag)
{
continue;
}
else
{
Log.d("Ramdom number", String.valueOf(rand));
vec.add(rand);
}
}
您可以維護產生的數字向量和檢查
的一個列表已經產生該號碼,然後產生新的
其他顯示此號碼
final int maxnumbers = 5;
final int maxvalue = 10;
final Random generator = new Random();
Set<Integer> numbers = new HashSet<Integer>();
while(numbers.size() < maxnumbers){
numbers.add(random.nextInt(maxvalue));
}
在此循環之後,您應該在集合numbers
中的0到maxvalue
之間有非重複的隨機數maxnumber
。您必須小心謹慎,以免在使用此方法時得到太多迭代次數,即在10000以內生成9999個非重複數字可能需要很長時間。
另一個更具擴展性的版本將有號碼的清單:
List<Integer> numbers = new ArrayList<Integer>();
for(int i = 0; i<maxvalue; i++){ numbers.add(i); }
Collections.shuffle(numbers);
List<Integer> randomnums = numbers.subList(0, maxnumbers);
啊,我喜歡你的方法去除dups。 –
爲什麼第二個代碼片段中的「subList(0,maxnumbers)」?無論如何,列表中只有'maxvalue'數字。 –
@PhilippReichart'maxnumbers'和'maxvalue'是兩個不同的值,列表包含'maxvalue'不同的值,其中他只需要'maxnumbers'。 – Jave
你想要的是一個隨機的組合,使用Hash表,以避免重複
從我頭頂的代碼應該是這樣的:
Ramdom r = new Random();
Hashtable<Integer, Integer> h = new Hashtable<Integer, Integer>();
while(h.keys().size() < 5) {
int i = r.nextInt(10);
h.put(i,i);
}
Integer[] k = (Integer[]) h.keySet().toArray();
線
h.put(i,i);
只是重寫值,如果它是重複的,所以只有不同的繪製數字將在哈希表中的條目。
我不認爲這是準確的 - 散列表不隨機排序值 - 有一個明確的算法。當你把這些數值拉出來時,會有偏差。我用'h.put(aRandomValue(),i)替換'h.put(i,i)'' –
@TonyEnnis哈希表的定義是密鑰是唯一的,它們沒有預定義的順序::::這個代碼只是選擇10箇中的5個不同的數字,如果你想用任何你喜歡的排序算法來排序。 – ilomambo
據我所知,散列表是爲了有效地提取和提取值而不是隨機排序。你認爲依賴黑盒代碼的一個好方法是一個好主意嗎? –
看看這個問題:http://stackoverflow.com/questions/4040001/creating-random-numbers-with-no-duplicates –
在你的真實代碼中'nextInt()'的值有多大? –
nextInt()將爲大約30. – Daler