你这样做的方式行不通... randomWhere 应用于整数集合时,将返回集合的元素(在本例中为 1 或 0)。
就这样吧
randomWhere(Available_Trucks,at->at==1); //this is the right synthax
将始终返回 1,因为这是集合中选择的数字的值。因此,您需要获得等于 1 的集合编号的索引。但是您必须自己创建一个函数来执行此操作...类似这样的方法(可能不是最好的方法,但可以:@ 987654322@
getRandomAvailbleTruck 函数会将集合(可能是 arrayList)作为参数。如果没有可用的卡车,它将返回 -1
int availableTrucks=count(collection,c->c==1);
if(availableTrucks==0) return -1;
int rand=uniform_discr(1,availableTrucks);
int i=0;
int j=0;
while(i<rand){
if(collection.get(j)==1){
i++;
if(i==rand){
return j;
}
}
j++;
}
return -1;
现在另一个想法是,您可以使用相关数字:1,2,3,4,5 ... 等,而不是使用 0 和 1 来表示可用性,如果不可用则使用 0。例如,如果卡车 3 不可用,则数组将为 1,2,0,4,5,如果可用,则数组将为 1,2,3,4,5。
在这种情况下,您可以使用
agent.ID=randomTrue(available_trucks,at->at>0);
但是如果没有可用的卡车,你会得到一个错误,所以检查一下。
尽管如此,你正在做的是可怕的做法......如果你的卡车是代理人,如果你把可用性放在你的卡车上,那么有一个更简单的方法来做到这一点......
然后你就可以做
Truck truck=randomWhere(trucks,t->t.available==1);
if(truck!=null)
agent.ID=truck.ID;