不重複地隨機獲取List或者陣列元素

2021-08-07 17:48:47 字數 3401 閱讀 8578

為了方便,我就以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...