0

我有一个集合 oneHundredInactiveSynapses,我想操纵该集合中 100 个 inactiveSynapses 中的随机 21 个,然后停止。我觉得应该有一个简单的方法来做到这一点,但我现在想不出任何东西。

for (Synapse inactiveSynapse : oneHundredInactiveSynapses) {
    // I want to call a method on the inactiveSynapse like
        inactiveSynapse.setActiveState(true);
        // but I only want to do this to 21 of the synapses. How can I do this?
}

其他要点:

  1. 将 oneHundredInactiveSynapses 放入数组不是一种选择
  2. 我不在乎哪个 21 变得活跃
4

4 回答 4

1

您可以复制Set、 shuffle 并获取前 21 个元素的子列表 -

List<Synapse> copy = new ArrayList<Synapse>(original);
Collections.shuffle(copy);
List<Synapse> sub = copy.subList(0, 21);
for(Synapse s : sub) { ... }
于 2013-06-18T23:13:55.693 回答
0

为了让它有点随机,你可以随机选择要触发的,直到你达到 21。请注意,如果你只剩下足够的时间来达到 21,你将不得不触发所有这些,所以对突触有一些偏见结尾。

    int chosen = 0;
    int left = oneHundredInactiveSynapses.size();
    java.util.Random rand = new java.util.Random();
    for (Synapse inactiveSynapse : oneHundredInactiveSynapses) {
        if(left-chosen>21) inactiveSynapse.setActiveState(true);
        else{
          if(rand.nextBoolean()){
            inactiveSynapse.setActiveState(true);
            chosen++;
            if(chosen==21) break;
          }
        }
        left--;
   }

但是,如果您真的不关心随机性,那么只需使用计数选择前 21 个,即

   int count = 0;
   for(Synapse inactiveSynapse : oneHundredInactiveSynapses){
     if(count==21) break;
     inactiveSynapse.setActiveState(true);
     count++;

   }
于 2013-06-18T23:11:47.943 回答
0

如果你对前 21 个没问题,你可以这样做:

int count = 0
for (Synapse inactiveSynapse : oneHundredInactiveSynapses) {
    if(count < 21){
        inactiveSynapse.setActiveState(true);  
        count++;        
    }else{
         break; 
    }

}

如果你想要随机,你可以这样做:

java.util.Random rand = new java.util.Random();
    int count = 0
    for (Synapse inactiveSynapse : oneHundredInactiveSynapses) {
        if(rand.nextInt(100) % 2){
            next;
        }
        if(count < 21){
            inactiveSynapse.setActiveState(true); 
             count++;         
        }else{
           break; 
        }

如果随机数是偶数,这将转到下一个元素,直到达到 21,这将中断。}

于 2013-06-18T23:14:10.270 回答
0

将 转换Set为数组,然后访问数组的 21 个随机元素。你的问题是这个集合只有 100 个元素,所以应该不会太贵。Set如果您无法选择具体的实现或更改填充集合的代码,那么沿着这些思路的东西是唯一的选择。

如果您可以更改填充该集合的代码,那么您当然可以在添加 21 个元素后让它停止。如果你可以注入你自己的Set实现,你可以有一个提供随机排序的实现,并且只迭代前 21 个元素。

于 2013-06-18T22:59:35.173 回答