问题如下:给定一个取数的范围 例如在1-100之间取数 要求设置一个取数的间隔 例如10
这样的话取数的范围被分成了十个间隔 1-10,要求不同的间隔用不同的压缩比取数,可以看成是等比数列
例如 间隔10 设定100% 全部的十个数都取,间隔9 设定50%,只取5个数,以此类推
最后输出全部的取数参数设置上:可以设定4个参数,取数的起始,例如1,和结束的值,例如100,取数的间隔,例如10 和压缩比的最高值,例如100%(最靠近结束值的那个间隔)请问该如何实现?万分感谢
这样的话取数的范围被分成了十个间隔 1-10,要求不同的间隔用不同的压缩比取数,可以看成是等比数列
例如 间隔10 设定100% 全部的十个数都取,间隔9 设定50%,只取5个数,以此类推
最后输出全部的取数参数设置上:可以设定4个参数,取数的起始,例如1,和结束的值,例如100,取数的间隔,例如10 和压缩比的最高值,例如100%(最靠近结束值的那个间隔)请问该如何实现?万分感谢
取数范围%取数间隔== 0?或者不等于0 无所谓,如果等于0的话简单些,不等于0的话,不够取数间隔的几个数也被看作一个取样间隔来处理
例如在1-100之间取数 间隔15,这样剩下的10个数也被看作一个取数间隔来处理
给定取数间隔的压缩比是根据给定的最高的压缩比来定的,比如最靠近100的那个取数间隔给定100% 全取
设定间隔总数n,给定的间隔位置为k (1<=k<=n),则给定间隔的压缩比为 100%*(k/n)
谢谢 望答复!
extractNumber(int start, int end, int span, float maxRate)
{
int spanCount = (end - start) / span;
float tMaxRate = maxRate;
for (int i = spanCount; i > 0; i--, max_rate /= 2)
{
randomSelect(start + span * (i - 1), start + i * span > end? end: start + i * span, max_rate);
}
}
randomSelect(int start, int end, float rate)
{
int[] arr = new int[end - start + 1];
int selectNumber = (end - start + 1) * rate;
int selected = 0;
Random random = new Random();
while (true)
{
if (selected < selectNumber) {
//Random类目前还不支持在一个范围随机选择,只要稍做改进就可以了,看你自己了
int index = random.nextInt(slected, end);
//这个你也需要自己做了,交换两个数组元素应该还是很简单的.
swap(arr[selected], arr[index]);
System.out.println(arr[selected]);
selected++;
}
else
{
break;
}
}
}程序写的很匆忙,要睡觉了, 肯定有很多错误,这需要你自己处理了.
应该是int index= random.nextInt(selected, end - start);
你这个唯一的难度就是选取随机数那里,可以用洗牌算法。
具体就是:
arr = [1,2,3,4,5,6,7,8,9]
先int i = Random.nextInt(0,9);
交换arr[0] = arr[i]
输出arr[0],这就是这次选取的随机数
下次选取
先int i = Random.nextInt(1,9);
交换arr[1] = arr[i]
输出arr[1],这就是这次选取的随机数
……
这样得到的随机数,是等概率的。