随机打印数组中的元素

时间:2015-09-18 02:01:24

标签: java random

有没有办法可以使用$.noConflict(); jQuery( document ).ready(function( $ ) { alert("safe to use jQuery's $ here"); $( "button" ).click(function() { $( "div.showMobile" ).toggleClass( "showMobileNav" ); }); }); 打印给定数组中的元素?

Math.random

所以输出就像

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

2,1,3

3,1,2

8 个答案:

答案 0 :(得分:0)

也许你可以通过洗牌然后打印来接近它。如果不应修改原件,您可以制作副本,然后随机播放副本。

有一些众所周知的洗牌阵列(或一副牌)算法。可以找到一个here。 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;
    }
}

答案 1 :(得分:0)

大多数答案中提出的方法效率极低,因为它在O(N 2 )时间内起作用。想一想:首先,你将通过一次尝试生成未使用的索引,但是接近结束时,当几乎所有数组都被处理时,它将需要几乎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]);
    }

我没有使用Collections.shuffle,因为它需要使用Collection并因此包装Integer元素,与普通int数组相比效率非常低。

另外,如果您可以修改原始阵列,可以将其随机播放(使用相同的Fisher-Yates shuffle),然后在遍历时使用它。

UPD:用洗牌初始化替换了shuffling索引数组。

答案 2 :(得分:0)

由于你有java 8,你可以利用漂亮的Stream API。

简而言之,您可以这样做:

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

其中1是生成的最低int(包括),500是最高的(不包括)。 limit表示您的信息流的长度为500,可能在您想要放置list.length的参数中。

对于你的情况:

        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(显然不会为您打印相同的数字)

答案 3 :(得分:-1)

正如我在评论中所说的那样。这个answer将起作用。您需要做的就是跟踪它访问的索引,这样您就不会重复它们或从数组中删除该元素。

void printRandom(int[] array) {
    if (array.length == 0)
        return;
    Random rand = new Random();
    int rnd = rand.nextInt(array.length);
    int element = array[rnd];
    array = ArrayUtils.removeElement(array, element);
    System.out.print(element);
    printRandom(array);
}

只需重复此过程,直到删除所有元素。显然添加检查以防止错误,请记住我很久没有使用过JAVA,所以如果你有问题可以回复!

最后请记住这会删除数组,因此您可能希望将此代码包装在函数中,然后将该数组复制为局部变量,以便您可以根据需要重用原始数据

答案 4 :(得分:-1)

创建一个可能与数组长度一样高的随机整数 - 1.如果随机整数等于先前使用的随机整数 - 通过在数组中存储使用的整数而知道 - 创建一个新的随机整数。否则,打印与随机整数指定的索引相关的字符串。如果存储使用的随机整数的数组的长度等于字符串数组的长度,则停止该过程。

这应该只打印所有字符串一次并随机打印。

答案 5 :(得分:-1)

在这种情况下,我们可以使用如下方式从数组中打印随机值:

<强>步骤:

  1. 创建Integer的列表对象以保存打印的索引
  2. 获取随机数并检查此索引是否已打印
  3. 如果没有打印,则使用此索引
  4. 将其添加到列表中并从数组中打印值
  5. 如果列表大小和数组长度相等,则终止循环

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    
    public class RandomIndices {
    
    public static void main(String[] args) {
        int[] list = new int[]{1, 2, 3};
        Random random = new Random();
        List<Integer> randomIndices = new ArrayList<>(); //to hold indices which are already printed
        boolean isRemain = true;
        while (isRemain) {
            int randomIndex = random.nextInt(list.length);
            if (!randomIndices.contains(randomIndex)) { //check random index value of array is printed or not
                randomIndices.add(randomIndex);
                System.out.println(list[randomIndex]);
            }
            if (randomIndices.size() == list.length) {
                isRemain = false;
            }
        }}
    }
    

答案 6 :(得分:-1)

这是解决方案

 public static void main(String[] args) {
        int[] list = new int[] { 1, 2, 3 };
        int[] aux = new int[list.length];
        int countTimes = 0;
        while (countTimes < list.length) {
            int position = new Random().nextInt(list.length);
            if (aux[position] != list[position]) {
                System.out.println(list[position]);
                aux[position] = list[position];
                countTimes++;
            }
        }
    }

答案 7 :(得分:-1)

实施一个简单的&#34; do while&#34;声明,以防止重复数字显示出你的数组(我使用StringArray - 但IntegerArray将以相同的方式工作 - 作为旁注,我可以在这里放置完整的代码,但不想这样做如果它不适用。我使用下拉列表选择要生成多少个随机单词 - 然后显示那组真正的随机单词(非重复):

    final Random rand1 = new Random();
    final Random rand2 = new Random();
    final int rndInt1 = rand1.nextInt(getResources().getStringArray(R.array.words).length);
                    int rndInt2 = rand2.nextInt(getResources().getStringArray(R.array.words).length);
                    if (rndInt1 == rndInt2){
                    do {
                        rndInt2 = rand2.nextInt(getResources().getStringArray(R.array.words).length);
                        }while (rndInt1 == rndInt2);//if indexes are equal - re-run the array search

                    }
                    outString = getResources().getStringArray(R.array.words)[rndInt1];
                    outString += ", " + getResources().getStringArray(R.array.words)[rndInt2];//concatenate the list 
                    textWord = (TextView) findViewById(R.id.textWords);//An empty text field in my layout
                    textWord.setText(outString);//Set that empty text field to this string of random array elements