簡體   English   中英

如何從Java中的HashSet中獲取100個隨機元素?

[英]How to get 100 random elements from HashSet in Java?

我有一個HashSet,其中我有10000個元素。 我想從該HashSet中提取隨機的100個元素。 所以我認為我可以在套裝上使用shuffle,但它不起作用。

Set<String> users = new HashSet<String>();

// for randomness, but this doesn't work
Collections.shuffle(users, new Random(System.nanoTime()));  

// and use for loop to get 100 elements

我現在不能使用shuffle,有沒有其他最好的方法從Java中獲取HashSet中的100個隨機元素?

在不構建新列表的情況下,您可以實現以下算法:

n = 100
d = 10000  # length(users)
for user in users:
    generate a random number p between 0 and 1
    if p <= n / d:
       select user
       n -= 1
    d -= 1

當您遍歷列表時,通過減少n來減少選擇未來元素的概率,但同時通過減少d來增加概率。 最初,您有100/10000的機會選擇第一個元素。 如果您決定采用該元素,您將有99/9999的機會選擇第二個元素; 如果你拿第一個,你將有更好的100/9999選擇第二個元素的機會。 數學計算結果是,最終,每個元素都有100/10000的機會被選中作為輸出。

對集合進行混洗意味着內部存在一些已定義的元素順序,因此可以對元素進行重新排序。 HashSet不是有序集合,因為內部沒有元素的順序(或者更確切地說,訂購的細節不會暴露給用戶)。 因此實現明智的是,對HashSet進行洗牌沒有多大意義。

你可以做的是將你的set中的所有元素添加到ArrayList ,隨機播放並獲得結果。

List<String> usersList = new ArrayList<String>(users);
Collections.shuffle(usersList);
// get 100 elements out of the list

java.lang.HashSet有一個順序,所以你不能隨機播放集合。 如果必須使用集合,則可以迭代集合並在隨機位置停止。

偽代碼:

Set randomUsers = new HashSet<String>();
Random r = new Random();
Iterator it = users.iterator(); 
numUsersNeeded = 100;
numUsersLeft = users.size();
while (it.hasNext() && randomUsers.size() < 100) {
  String user = it.next();
  double prop = (double)numUsersNeeded / numUsersLeft;
  --numUsersLeft;
  if (prop > r.nextDouble() && randomUsers.add(user)) { 
    --numUsersNeeded;
  }
}

你可能會重復這一點,因為沒有你可以獲取100個元素的garantiy。

如果內存沒有問題,你可以創建一個數組並選擇100個隨機元素:

偽代碼II:

Object userArray[] = user.toArray();
Set<String> randoms = new HashSet<String>();
while(randoms.size() != 100) {
  int randomUser = userArray[new Random().nexInt(10000)];
  randoms.add(randomUser);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM