我有一个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
Run Code Online (Sandbox Code Playgroud)
我现在不能使用shuffle,有没有其他最好的方法从Java中获取HashSet中的100个随机元素?
我需要n从一组N(where 0 < n < N)中随机选择记录.
一种可能的算法是:
遍历列表并为每个元素,使选择的概率=
(number needed) / (number left)因此,如果您有40个项目,则第一个项目有
5/40可能被选中.如果是,下一个有
4/39机会,否则它有5/39机会.当你到达目的地时,你会得到5件物品,而且在此之前你通常会拥有所有物品.
假设一个好的伪随机数发生器,这个算法是否正确?
注意
stackoverflow上有很多这类问题(其中很多都被标记为C#中List <T>中选择N个随机元素的重复).
上面的算法经常被提出(例如Kyle Cronin的答案)并且总是受到质疑(例如,见 这里,这里,这里,这里 ......).
我可以对此事做最后的决定吗?
我用以下代码构建MyObject数组:
MyObject[] myObject = (from MyObject varObj in MyObjects
select varObj).ToArray();
Run Code Online (Sandbox Code Playgroud)
现在,我想从这个数组中提取3个随机MyObject!我怎么能在C#上做到这一点?
当然,如果数组长度<3,我需要提取所有对象!
我正在使用以下代码生成反CSRF令牌:
TokenCSRF = new Random(Guid.NewGuid().GetHashCode()).Next(1, 9999).ToString();
Run Code Online (Sandbox Code Playgroud)
这个令牌是可猜测的还是真正随机的?
编辑:我用这个替换了令牌生成器:
byte[] byt = new byte[sizeof(Int32)];
RNGCryptoServiceProvider rngCrypto = new RNGCryptoServiceProvider();
rngCrypto.GetBytes(byt);
return BitConverter.ToInt32(byt, 0);
Run Code Online (Sandbox Code Playgroud)