為了方便,我就以list為例:第一種方法的思路是:用set儲存已經取過的下標,每次迴圈取的時候,判斷是否已經取過 如果已經取過就跳過本次迴圈,一直到取num為止
這個方法不推薦使用,可能會發生死迴圈
如果每一次的資料值都是同乙個,那麼就是死迴圈了,雖然概論極其低,但是不代表沒有
public
static
list getlistunique1
(list sources, int
num)
// 複製乙份,以免對原資料造成影響
list _sources = new arraylist(sources);
list targetlist = new arraylist(num);
setgotindexs = new hashset<>(num); // 以獲取的下標
random random = new random();
while (gotindexs.size() < num)
return targetlist;
}
第二種方法思路是:每一次迴圈取完資料後,從目標list中移除本次取的資料,list的大小也變小了,下一次迴圈產生的隨機數最大值也是list的size,所以不會發生越界問題。
public
static
list getlistunique2
(list sources, int
num)
// 複製乙份,以免對原資料造成影響
list _sources = new arraylist(sources);
list targetlist = new arraylist(num);
random random = new random();
for (int k = 0; k < num; k++)
return targetlist;
}
第三中方法思路:每一次迴圈取完資料後,把list size - k -1 的元素 放到本次取到的index位置,下次迴圈的隨機數最大值為list size - k
public
static
list
getlistunique3
(list sources,
intnum)
// 複製乙份,以免對原資料造成影響
list _sources = new arraylist(sources);
list targetlist = new arraylist(num);
random random = new random();
for (int k = 0; k < num; k++)
return targetlist;
}
最簡單的是把陣列轉換為arraylist,然後就一樣了
根據上面的思路,用陣列實現。
/**
* 獲取不重複下標的元素
*/public
class
uniquecollectionindex
system.out.println(getlistunique1(list1, num));
system.out.println(getlistunique2(list1, num));
system.out.println(getlistunique3(list1, num));
}//***** list *******
/** * 不推薦使用,可能會發生死迴圈
* 用set儲存已經取過的下標,每次迴圈取的時候,判斷是否已經取過
* 如果已經取過就跳過本次迴圈,一直到取num為止
** @param sources 目標list
* @param num 獲取元素的數量
* @return 獲取的list
*/public
static
list
getlistunique1
(list sources,
intnum
) // 複製乙份,以免對原資料造成影響
list _sources = new arraylist(sources);
list targetlist = new arraylist(num);
setgotindexs = new hashset<>(num); // 以獲取的下標
random random = new random();
while (gotindexs.size() < num)
return targetlist;
}/**
* 每一次迴圈取完資料後,從目標list中移除本次取的資料
** @param sources 目標list
* @param num 獲取元素的數量
* @return 獲取的list
*/public
static
list
getlistunique2
(list sources,
intnum
) // 複製乙份,以免對原資料造成影響
list _sources = new arraylist(sources);
list targetlist = new arraylist(num);
random random = new random();
for (int k = 0; k < num; k++)
return targetlist;
}/**
* 每一次迴圈取完資料後,把list size - k -1 的元素 放到本次取到的index位置,
* 下次迴圈的隨機數最大值為list size - k
** @param sources 目標list
* @param num 獲取元素的數量
* @return 獲取的list
*/public
static
list
getlistunique3
(list sources,
intnum
) // 複製乙份,以免對原資料造成影響
list _sources = new arraylist(sources);
list targetlist = new arraylist(num);
random random = new random();
for (int k = 0; k < num; k++)
return targetlist;
}}
不重複隨機數
1 不重複隨機數1 生產 lowerbound,upperbound 的隨機數,核心 int upperbound lowerbound 1 rnd lowerbound 示例 如下 sub rndnumnorepeat1 dimdic dim i set dic createobject scri...
不重複隨機數生成
直接上 生成 0,total 的隨機數 最大隨機數 ilist private static ilistgetrandomsequence int total random random new random for var i listbase.count 1 i 0 i return listo...
JavaScript 不重複隨機數
在echarts顏色生成中,用到隨機數來產生0到4的數字,來指代顏色陣列的其中乙個,簡單寫了個隨機數,然後介面生成時,會出現相鄰區塊的顏色相同。新增乙個標籤flag,然後每次判斷,如果為相同就迴圈呼叫。生成從minnum到maxnum的隨機數 var flag 0 function randomnu...