你现在能随机取这个数中的任意一位么?
你先判断这里面有没有1,如果没有返回-1,如果有就用while循环做,对每次的随机值判断,如果是0则继续循环取随机,如果是1则跳出循环。

解决方案 »

  1.   

    我觉得先写个算法把一个数2进制表示中是1的位的整数位置取出来,存到一个数组中,
    你的例子中:int pos[] = new int[5]
    pos[0]=0;
    pos[1]=5;
    pos[2]=7;
    pos[3]=9;
    pos[4]=10;然后产生个5以内的随机数,取pos数组的一个值,然后再取出这个位置的值
      

  2.   

    想问楼主,你要求高速,是不是要重复调用很多次?
    那么每次嗲用的bitmap里的值是不是一样?
      

  3.   

    我觉得先写个算法把一个数2进制表示中是1的位的整数位置取出来,存到一个数组中,
    你的例子中:int pos[] = new int[5]
    pos[0]=0;
    pos[1]=5;
    pos[2]=7;
    pos[3]=9;
    pos[4]=10;然后产生个5以内的随机数,取pos数组的一个值,然后再取出这个位置的值
    应该是这样的吧
      

  4.   

    我有个大概的思路,不知道可不可行
    把这个数看作一个java的bitset,通过移动位置或者和某个bitset进行XOR得到某个恰好是1的随机位置
    大家看看具体如何处理才好,最好一个运算就可到结果
      

  5.   

    整数也可以用bitset来替代,我是实现一个对象重复使用的服务程序碰到这个问题的
    具体的说,由于是一个数学上的Monte Carlo模拟,模拟过程具有天文数的对象产生和死亡,这个是通过Poisson分布来决定的
    我使用的是工厂来控制对象的活动和非活动状态,所有的对象都保存在一个数组中,同时通过一个bitset来描述所有对象的状态,比如工厂数组中有10个对象,一个bitset对应有10位,10位分别是0,1,1,1,0,0,1,0,0,0表示位于位置1,2,3,6的对象活动状态,其他位置的对象是非活动的,当工厂收到一个请求,就通过(正态分布)随机选择一个bitset位置上正好是0的相对的对象输出,同时bitset这个位置上置1,同时在模拟过程中工厂会收到一个信息,让所有活动对象中的任意一个对象状态成为非活动的,需要通过随机的选择一个活动对象,设置对应的bitset上的位是0
    这是一个简单的例子,实际上我的对象大大多于10个,其它的解决方案也考虑过,但是存在大量的对象的移动,开销太大,所以考虑使用bitmap来记录和修改对象的状态
    请大家继续发言
      

  6.   

    是不是只要选择的bitset位置上为0即可?那只需要随机定位之后向前或向后或前后一起搜索位置为0的就行了,不必用正太分布的吧?比如0,1,1,1,0,0,1,0,0,0,我随机抽取到第3位,则向前或向后搜索都可以得到为0的位置。这是居于你的bitset是随机分布的较好方法,如果bitset有可能是某种特定分布的话,需要做相应优化。这也是我上面提到的算法思想。
      

  7.   

    >是不是只要选择的bitset位置上为0即可要求可以随机选0而且可以随机选1,这个具体不好讲,关于生灭过程的(生:1灭:0)
    这个算法不太理想的原因是假如bitmap有1000位(1000对象),但是仅仅有比如2个位上是1,我现在选择随机的一个1,有可能会找998次才找到
    我是0.625 msec就要产生一个生灭事件,也就是需要随机找到一个0或者1(实际上还有其他4种随机事件需要处理,这里我简化简单的生灭事件),对于对应的对象来处理,模拟过程是24小时
    现在抛开我的思路,各位给点建议如何实现才好
      

  8.   

    我认为:把这个数与1111111这样的数相与,这位数为1的结果肯定也是1 了。得到的新数,用indexOf("1")判断初始位置即可,如果为-1则证明没有1这样的数了。而这样的结果是每次得到第1个的数!
      

  9.   

    yangjuanli(珂儿): 
    但是他的bitmap是1000位的,而且需要将这种储存格式转化成字符串不是太好,另外indexOf的机制也是从0位开始搜索,效率不见得有多快....