当前位置: 首页 > 知识库问答 >
问题:

随机打印数组中的元素

敖毅
2023-03-14

有没有一种方法可以让你使用数学。随机打印给定数组中的元素?

int[] list = new int[] {1,2,3};

所以输出将是

2,1,3

或者

3,1,2

2,3,1 

共有3个答案

欧阳衡
2023-03-14

因为您有Java8,所以可以利用漂亮的流API。

简而言之,你可以做到:

new Random().ints(1, 500).limit(500).forEach(p -> System.out.println(list[p])); 

其中1是生成的最小int(包括在内),而500是最高的(不包括在内)。

对于您的情况:

        int[] list = new int[] {1,2,3,4,5,6};
        new Random().ints(0, list.length).limit(10).forEach(p -> System.out.println(list[p])); 

打印:5 2 5 4 6 3 3 5 6 4(显然不会为您打印相同的数字)

尹弘壮
2023-03-14

大多数答案中提出的方法效率极低,因为它在O(N2)时间内工作。想想看:一开始,您只需一次尝试就可以生成未使用的索引,但接近尾声时,当几乎所有数组都被处理时,生成下一个未使用的索引将需要将近N个步骤。

最佳的O(N)方法是创建索引的混洗数组(0... N),每个索引只出现一次,然后按照混洗索引的顺序处理原始数组。每个步骤需要O(N)时间,所以整个算法是O(N)。

    int[] input = new int[]{5, 4, 3, 6, 2, 1};
    int []indices = new int[input.length];

    //Fisher-Yates shuffle
    Random rnd = new Random();
    for (int i = 0; i < indices.length; i++) {
        int j = rnd.nextInt(i + 1);
        indices[i] = indices[j];
        indices[j] = i;
    }

    for (int i : indices) {
        System.out.println(input[i]);
    }

我没有使用集合。shuffle,因为它需要使用Collection,从而包装Integer元素,这与普通int数组相比效率非常低。

此外,如果你可以修改你的原始数组,你可以在原地洗牌(使用相同的Fisher-Yates洗牌),然后在遍历时消耗它。

UPD:将索引的无序数组替换为无序初始化。

向俊贤
2023-03-14

也许你可以通过洗牌数组来接近它,然后打印它。如果原始的不应该被修改,你可以复制一个副本,然后洗牌副本。

洗牌数组(或一副牌)有很多著名的算法。在这里可以找到一个。java中的实现如下所示:

static void shuffleArray(int []array) {
    int length = array.length;
    for (int i = length -1; i > 0; i--) {
        // generate a random 0 <= j < i
        int j = (int)(Math.random() * i);
        // swap elements at i and j
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}
 类似资料:
  • 我正在尝试编写一个程序,打印一个2d数组,其中包含100-10000范围内的随机数,并打印出数组中的最大值、平均值和最小值。该程序将询问用户行数和列数,并在该数组中打印随机数。 这是我的代码:

  • 我有几个问题。我正在做家庭作业,但遇到了一些令人困惑的事情。(我上的是入门课,有错误,很抱歉。) 实现一个以整数数组和int x作为其大小的类。在类中创建一个方法,该方法创建一个长度比数据长度大1的新数组。然后创建一个方法,将所有数据元素复制到新数组中,并将x值添加到数组的最后一个元素中。创建一个方法来返回新数组中的所有整数。 这是我的 这只是返回NULL。 我的问题是上面任务的最后一点。“创建一

  • 问题内容: 我有一个字符串数组: 我从中得到随机元素: 现在我想获得当我按下按钮以获取随机水果时苹果所处的数字,例如当我按下randon按钮时,它给了我Banana ..并且还应该给我那个元素编号是 我得到了元素,但是获取元素编号有问题,所以请帮帮我 问题答案: 只需将生成的索引存储在变量中,然后使用此变量访问数组: PS我通常不喜欢每次随机化生成新对象-我更喜欢在程序中使用单个对象- 然后重新使

  • 问题内容: 我是编码的新手,我最近制作了“十进制到二进制”和“二进制到十进制”转换器,并且我希望raw_input的文本像打字机一样一次键入一个字母,但是这样做之后我会得到None,因为函数不返回任何东西。我不确定如何解决此问题,因为我希望raw_input是一个变量,并且尝试返回内容会给我带来语法错误。任何帮助表示赞赏。 这是重要的部分^ 完整的程序供有兴趣的人使用:http : //paste

  • int main(void) { int array[201]; int i; for (i = 0; i < 201; i++) array[i] = i; return 0; } 技巧 在gdb中,如果要打印数组中任意连续元素的值,可以使用“p array[index]@num”命令(p是print命令的缩写)。其中index是数组索引(从0开始计数),num是连

  • 我有一个python问题,我对这方面还不熟悉,想知道我缺少了什么。 我想做的事情是打印一个嵌套的元组,但从内到外。 例如:应打印为null,A,B,C 所有元组的最大大小为2。 我在考虑使用递归函数来实现这一点;我有这个密码,但我不知道怎么了。 我不是在问这个问题的答案(那太好了),但如果你能告诉我代码出了什么问题,我将不胜感激。 有人吗?有什么想法吗? 谢谢