如何在Java中随机打印Vector的内容?

时间:2014-05-06 21:08:57

标签: java random vector

我需要以随机顺序打印Vector的内容,而不需要Java中的重复项。到目前为止我有这个:

 for(int p = 0; p < v.size(); p++) {
        boolean print = true;
        int n = Math.abs(r.nextInt() % v.size());
        Vector<Integer> printed = new Vector<Integer>();
        if(printed.contains(n))
            print = false;
        if(print)
            System.out.println(v.elementAt(n));
        printed.addElement(n);
    }

其中“v”是我的字符串向量,“r”是我的随机生成器(按时间播种)。它以随机顺序打印,但仍然打印重复。

有什么建议吗?

3 个答案:

答案 0 :(得分:0)

首先,没有理由使用Vector。自Java 1.2以来,它已被有效地弃用,超过15 years ago。请改用ArrayList

另请注意,调用Random.nextInt() % max是反模式,会破坏生成器的随机性。如果您希望整数范围小于Random.nextInt(max),请始终致电Random.nextInt() - 后一种方法旨在做正确的事情并为您提供均匀分布。


好的,所以你想要删除重复项,并且你也想要以任意(或者你的字面意思是随机?)顺序打印。

实现这两个目标的最简单方法是使用Set。常见的Set实现,特别是HashSet,是明确无序的,这意味着它们的添加顺序不一定是它们返回的顺序。

所以你可以简单地做到以下几点:

List<Integer> ls = ...;
for(Integer i : new HashSet<Integer>(ls)) {
  System.out.println(i);
}

然而就像我说的那样,任意顺序和正确随机之间存在差异。 HashSet是任意的,但在其实现中存在潜在的可预测模式,因此无法调用上述代码的输出&#34; random&#34;。

如果你真的想要随机排序,你最好的选择是Collections.shuffle()函数,它接受一个列表并对其进行洗牌,这样每个元素几乎同样可能位于列表中的任何位置。这是一些示例代码(注意我们必须首先通过HashSet来删除重复项):

List<Integer> ls = ...;
ls = new ArrayList<Integer>(new HashSet<Integer>(ls));
Collections.shuffle(ls);
for(Integer i : ls) {
  System.out.println(i);
}

这将以随机*顺序打印ls的唯一元素。

*从技术上讲,它是伪随机的,但没有必要担心。它已足够随机了。

答案 1 :(得分:0)

Collections.shuffle(矢量) 然后获取输出并将其放入一组(不要使用SortedSet)。 您现在已经随机化并删除了重复项。

答案 2 :(得分:0)

您可以像这样初始化Vector:

Vector<Integer> printed = new Vector<Integer>();

然后检查printed是否包含某些内容:

if(printed.contains(n))

但是,您刚刚初始化printed以包含零元素。

因此,printed.contains(n) 始终false

因此,print永远不会设置为falsev中的所有元素都会打印到控制台。