问题如下:给定一个取数的范围 例如在1-100之间取数 要求设置一个取数的间隔 例如10
这样的话取数的范围被分成了十个间隔 1-10,要求不同的间隔用不同的压缩比取数,可以看成是等比数列
例如 间隔10 设定100% 全部的十个数都取,间隔9 设定50%,只取5个数,以此类推
最后输出全部的取数参数设置上:可以设定4个参数,取数的起始,例如1,和结束的值,例如100,取数的间隔,例如10 和压缩比的最高值,例如100%(最靠近结束值的那个间隔)请问该如何实现?万分感谢

解决方案 »

  1.   

    谢谢你的答复,
    取数范围%取数间隔== 0?或者不等于0 无所谓,如果等于0的话简单些,不等于0的话,不够取数间隔的几个数也被看作一个取样间隔来处理
    例如在1-100之间取数 间隔15,这样剩下的10个数也被看作一个取数间隔来处理
    给定取数间隔的压缩比是根据给定的最高的压缩比来定的,比如最靠近100的那个取数间隔给定100% 全取
    设定间隔总数n,给定的间隔位置为k (1<=k<=n),则给定间隔的压缩比为 100%*(k/n)
    谢谢 望答复!
      

  2.   

    我写个简单的,具体错误处理得看你自己的了.
    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;
          }
       }
    }程序写的很匆忙,要睡觉了, 肯定有很多错误,这需要你自己处理了.
      

  3.   

    我今天早上突然想到那个随机取的地方有问题.
    应该是int index= random.nextInt(selected, end - start);
      

  4.   

    你自己都说出来了还不会写吗?
    你这个唯一的难度就是选取随机数那里,可以用洗牌算法。
    具体就是:
    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],这就是这次选取的随机数
    ……
    这样得到的随机数,是等概率的。