丢弃一次使用的数组项

时间:2012-07-30 19:36:25

标签: java

如何确保只生成一次随机数?

例如:

for(int i = 0; i<len; i++)
    {
        while (rands.contains(rand = r.nextInt(len-2)+1));
        rands.add(rand);
        System.out.print ("Rand ___ " + rand + "___");
    }

如何确保如果从rand生成数字2,它将不再生成?

如果我不清楚自己,我道歉。如果您需要更多信息,请发表评论。

感谢。

5 个答案:

答案 0 :(得分:1)

使用随机API时,您无法真正限制它。您可能需要保留已生成数字的列表,如果尚未生成数字,则返回该数字。

答案 1 :(得分:1)

您必须存储您生成的所有数字,然后检查新数字。出于性能原因使用HashSet

HashSet<Integer> rands = new HashSet<Integer>();
for(int i = 0; i<3; i++)
{
   int rand;
   while (rands.contains(rand = r.nextInt(3)))
       ;
   rands.add(rand);
}

答案 2 :(得分:0)

我假设你想以随机顺序创建一个0-2的数字列表(如果我错了,请告诉我)

您真正想要的是创建这些数字的列表

ArrayList<Integer> randomNums = ArrayList<Integer>() {{ add(0); add(1); add(2); }}

然后使用Collections来改变它。

Collections.shuffle(randomNums)

答案 3 :(得分:0)

你需要使用一个改组算法。从1开始。创建一个从1到1000(任意大小)的整数数组。将阵列洗得很好。继续从洗牌阵列中取出,直到你用完它们为止。当您通过1000时,使用1000-2000,shuffle和use重新填充数组。根据需要多次重复此过程。

答案 4 :(得分:0)

如果您只需要某个范围内的非重复随机数流,您可以执行以下操作:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

public class RandomNumberStream {
    private Iterator<Integer> numbers;

    public RandomNumberStream(int range) {
        List<Integer> numbersList = new ArrayList<>(range);
        for(int i = 0; i < range; i++) {
            numbersList.add(i);
        }
        Collections.shuffle(numbersList);
        numbers = numbersList.iterator();
    }

    public int nextNumber() {
        if(!numbers.hasNext()) {
            throw new IllegalStateException("No more numbers...");  //you might want to handle this differently
        }
        return numbers.next();
    }

    public static void main(String[] args) {
        RandomNumberStream rand = new RandomNumberStream(5);

        for(int i = 0; i < 5; i++) {
            System.out.println(rand.nextNumber());
        }
    }
}