经常用到,随机混排啥的场景,
从长度为N(很大)的数组里找到M(较小)个不重复元素下标的随机迭代器
空间复杂度 M
时间复杂度 Mlog(M)
神马100挑10个、100挑99个、10000000挑100、10挑10之类M比较小的场景都是性能稳定的,没有随机碰撞的情况,比较适合广大重度强迫症患者;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Random;
/**
* @author fudi
* @since 2013-10-30
*/
public class RandomIndexIterator implements Iterator<Integer> {
private int index;
private int limit;
private HashMap<Integer, Integer> map;
private int poolSize;
private Random random;
public RandomIndexIterator(int poolSize, int limit) {
this(poolSize, limit, new Random());
}
public RandomIndexIterator(int poolSize, int limit, long seed) {
this(poolSize, limit, new Random(seed));
}
public RandomIndexIterator(int poolSize, int limit, Random random) {
this.random = random;
this.limit = limit;
this.poolSize = poolSize;
this.map = new HashMap<Integer, Integer>(limit << 1);
}
@Override
public boolean hasNext() {
return index < limit;
}
@Override
public Integer next() {
if (index >= limit) {
return null;
}
int rIndex = this.random.nextInt(poolSize - index) + index;
Integer current = map.get(index);
if (current == null) {
current = index;
}
Integer previous = map.get(rIndex);
if (previous == null) {
previous = rIndex;
}
map.put(rIndex, current);
map.put(index, previous);
++index;
return previous;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
分享到:
相关推荐
电脑随机产生大数,实现大数相乘,密码学中用的~~~~~~
本文讨论随机大数定律, 得到一个随机变量序列分别服从随机弱大数定律和随机强大数定律的充要条件。
由于时间匆忙,上传了一个错误的代码,若给大家带来不便,请多包含!
n! 大数的阶乘 c++ n! 大数的阶乘 cn! 大数的阶乘 c++++
poj 1001题目提交ac的代码,大数n方次,实现为大数相乘
任意两个大数乘法,理论上可算2G长度的两个数的乘法,C++实现,在VS 2008下编译通过
php一个大数组按照某一个倍数拆分成N个小数组 原生(内置demo) Ps:如果觉得好请给一个评价(赞)
* 在循环中,只要除数不等于0,用较大数除以较小的数,将小的一个数作为下一轮循环的大数,取得的余数作为下一轮循环的较小的数,如此循环直到较小的数的值为0,返回 * 较大的数,此数即为最小公约数,最小公倍数为...
在m*m的棋盘上有n个皇后(n ≤ m),输出所有合法的皇后排列(即在任何一行、一列或一条对角在线,仅能放置一个皇后)。 3、 实现图书馆借书系统,其功能包括: (1) 申请新的图书证; (2) 注销图书证; (3) ...
3D之父编写的一个函数,没有用到递归,而是用了一个非常特殊的数字。
以体现变量间的交互作用 interaction 它对离群值也不敏感 本文通过3 个案例 分别介绍了随机森林在昆虫 种类的判别分析 有无数据的分析 取代逻辑斯蒂回归 和回归分析上的应用 案例的数据格式和R 语言代码可 为研究...
根据大数定律,由均匀分布随机数产生正态分布随机数
两个N位大数的减法,比如两个100位甚至1000位的两个大数相减,利用此控制台程序就可以正确无误的计算出来。
N!的求法 大数阶乘 最好的大数阶乘程序 C++
利用高精度求N的阶乘,采用大进制可以节约时间...
输入大数的位数,位数必须小于1000,然后内随机产生2个大数,然后求他们的和。
此程序经过本人认真研究,结果正确。希望能给大家一点帮助。 说明:1.程序代码已通过VC 6.0测试 2.rar是程序源代码
大数计算器,采用迭代等算法我用它计算了上亿位的PI值://改进方向: // 1.强力优化ArrayMUL数组乘运算(当前实现了二分法和FFT算法): // a.将实数按齐偶作为复数进行傅立叶变换的算法实现,加快乘法速度 // b.实现...
随机产生大数,相加。大数运算运算运算元素按运算
经过好长时间终于改对了,适用于VC 6.0环境。可以产生小于1000位的数,并对其实现乘法计算。