因为您有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
(显然不会为您打印相同的数字)
大多数答案中提出的方法效率极低,因为它在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:将索引的无序数组替换为无序初始化。
也许你可以通过洗牌数组来接近它,然后打印它。如果原始的不应该被修改,你可以复制一个副本,然后洗牌副本。
洗牌数组(或一副牌)有很多著名的算法。在这里可以找到一个。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是连
问题内容: 假设我有一个数组,我想随机选择一个元素。 最简单的方法是什么? 明显的方法是。但是也许有红宝石之类的东西?或者如果不能通过扩展创建这种方法? 问题答案: Swift 4.2及更高版本 推荐的新方法是Collection协议的内置方法:。它返回一个可选参数以避免我以前假设的空情况。 如果不创建数组并且不能保证count> 0,则应执行以下操作: Swift 4.1及以下 只是为了回答您的