此方法是否检查并替换数组中的random?
public void generateNumbers()
{
for(int counter=0; counter< 6; counter++){
numbers[counter]= 1+ (int)(Math.random()*49);
for(int y = counter - 1; y >=0 ; y--){
if(numbers[counter] == numbers[y]){
numbers[counter]= 1+ (int)(Math.random()*49);
}
}
}
如果有重复项,我需要用另一个随机数替换它,然后再次检查。我希望尽可能使用循环来检查这个,而不是使用集合。
随机创建的数字范围应为1 - 49。
答案 0 :(得分:1)
对于这些问题,通常有更好的算法。您的示例是对抽奖进行建模,可以将其描述为:从一堆m个元素中抽取n个元素。在你的情况下,n:= 6; m:=从1到49的数字 - 但你可以根据需要进行调整(甚至在桶中有多个相似的元素)。
因此,解决这个问题的更好方法是:
创建一个基本列表,其中包含绘制前可用的所有项目,即包含数字的列表1..49
创建一个空结果列表
循环迭代n次,执行以下操作:
在0和最大项目数之间选择列表的随机索引(仍然存在于列表中)
从基本列表中取出3.1中索引处的项目,并将其添加到结果中
从基本列表中删除索引处的项目。这可确保在结果中第二次不会出现相同的数字。因此,下次执行步骤3.1时,基本列表中的最大项目数将减少1个。
我不会详细介绍如何用Java编写所述算法,因为它的味道很像家庭作业。
答案 1 :(得分:0)
您需要在找到重复内容时“快退”回counter-1
,以便您再次开始搜索重复内容:
public void generateNumbers()
{
for(int counter=0; counter< 6; counter++){
numbers[counter]= 1+ (int)(Math.random()*49);
for(int y = counter - 1; y >=0 ; y--){
if(numbers[counter] == numbers[y]){
numbers[counter]= 1+ (int)(Math.random()*49);
y = counter - 1; // <<<===== ADDED
}
}
}
如果从这个数组开始,原始方法将失败
1 3 7 8
然后生成3,对8和7检查,找到重复3,并生成8作为替换。此时,您的算法将检查8对1,并确信没有重复;这是不正确的。