Bir diziden rastgele bir öğe nasıl seçilir


103

Bir tamsayı dizisinden rastgele sayı seçmek için çözüm arıyorum.

Örneğin bir dizim var new int[]{1,2,3}, rasgele bir sayıyı nasıl seçebilirim?


Yanıtlar:


194
public static int getRandom(int[] array) {
    int rnd = new Random().nextInt(array.length);
    return array[rnd];
}

2
evet, ama generatorbunun bir örnek olduğunu söylemelisinizjava.util.Random
stivlo

27
Random()İşlevi her çalıştırdığınızda yaratmazdım : rastgele oluşturucunun geçmişe sahip olması gerekir. Olmamışsa, son derece tahmin edilebilir. Bu durumda bu hiç sorun değil - ancak bunun array[(int)(System.currentTimeMillis() % array.length)]önerilen çözüm kadar iyi olduğu belirtilmelidir.
alf

7
@alf, bu önerilen çözüm kadar iyi olmaktan uzaktır. new Random()önceden oluşturulmuş olandan farklı bir çekirdeğe sahip bir örnek oluşturmaya çalışır Random. Yaklaşımınız, yalnızca işlevi kısa sürede iki kez çalıştırarak korkunç bir şekilde bozulacaktır.
aioobe

1
@alf bazı sistemlerde milisaniyeye kadar doğru bir saat bulunmaz ve bu durum bazı seçenekleri engelleyebilirgcd(array.length,clockAccuracy)!=1
cırcır ucube

3
Bu yanıta olumsuz oy verdiğime dair bir bildirim fark ettim - yanlışlıkla tıklamış olmalıyım; ne yazık ki arayüz bunu geri almama izin vermiyor (cevap düzenlenmedikçe oyumu değiştiremeyeceğimi söylüyor ...). Yani, Chris Dennett'ten özür dilerim.
Peter Hanley

13

Rastgele bir dizin oluşturmak ve bu dizindeki öğeyi döndürmek için Rastgele oluşturucuyu kullanabilirsiniz:

//initialization
Random generator = new Random();
int randomIndex = generator.nextInt(myArray.length);
return myArray[randomIndex];

9

Birden çok kez rastgele bir öğe alacaksanız, rastgele sayı üreticinizin yalnızca bir kez başlatıldığından emin olmak istersiniz.

import java.util.Random;

public class RandArray {
    private int[] items = new int[]{1,2,3};

    private Random rand = new Random();

    public int getRandArrayElement(){
        return items[rand.nextInt(items.length)];
    }
}

Tahmin edilemez olması gereken rastgele dizi öğeleri seçiyorsanız , Random yerine java.security.SecureRandom kullanmalısınız . Bu, eğer birisi son birkaç seçimi biliyorsa, bir sonrakini tahmin etmede bir avantajı olmayacağını garanti eder.

Eğer eşdeğer ilaç kullanımıyla bir nesne diziden rastgele bir sayı almak için arıyorsanız, size (Kaynak bunun için bir metot tanımlayabiliriz Avinash R içinde dize diziden Rastgele elemanı ):

import java.util.Random;

public class RandArray {
    private static Random rand = new Random();

    private static <T> T randomFrom(T... items) { 
         return items[rand.nextInt(items.length)]; 
    }
}

3

kullanımı java.util.Random: 0 ve dizi uzunluğu arasında rastgele bir sayı üretmek için random_numberbir tam sayı için, ve daha sonra rasgele sayı kullanımı:array[random_number]


3

Random sınıfını kullanın :

int getRandomNumber(int[] arr)
{
  return arr[(new Random()).nextInt(arr.length)];
}

2

Ayrıca kullanabilirsin

public static int getRandom(int[] array) {
    int rnd = (int)(Math.random()*array.length);
    return array[rnd];
}

Math.random()doublearasında 0.0(dahil) ile döner1.0 (hariç)

Bu çarparak array.lengthsize verir doublearasındaki 0.0(dahil) vearray.length (hariç)

Çevirme intişlemi aşağı yuvarlanarak size 0(dahil) ve array.length-1(dahil) arasında tam sayı verir


Math.random (), int değil, double döndürür.
Akshay R.

1

Java 8'e sahip olduğunuz için, başka bir çözüm de Stream API kullanmaktır.

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

1Üretilen en düşük int (dahil) ve 500en yüksek (dışlayıcı) nerede . limityayınınızın 500 uzunlukta olacağı anlamına gelir.

 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])); 

Rastgele java.utilpaketten.



0

Bu yaklaşımı da deneyebilirsiniz ..

public static <E> E[] pickRandom_(int n,E ...item) {
        List<E> copy = Arrays.asList(item);
        Collections.shuffle(copy);
        if (copy.size() > n) {
            return (E[]) copy.subList(0, n).toArray();
        } else {
            return (E[]) copy.toArray();
        }

    }

Yani O(nlogn)zaman karmaşıklığı olan bir listeyi karıştırıyorsunuz , OP'nin sorduğu problem O(1)zaman karmaşıklığı ve O(1)hafıza ile çözülebilmesine rağmen, ilk dizinin toplam 3 katı kadar belleği kullanarak iki kez kopyasını oluşturuyorsunuz ...?
Jaroslaw Pawlak

evet, haklısınız, sabit zaman ve uzay karmaşıklığıyla yapmak daha iyiydi.
Ravi Sapariya

-1

Java, java.util paketinde bir Random sınıfına sahiptir. Bunu kullanarak şunları yapabilirsiniz:

Random rnd = new Random();
int randomNumberFromArray = array[rnd.nextInt(3)];

Bu yardımcı olur umarım!


-1
package workouts;

import java.util.Random;

/**
 *
 * @author Muthu
 */
public class RandomGenerator {
    public static void main(String[] args) {
     for(int i=0;i<5;i++){
         rndFunc();
     } 
    }
     public static void rndFunc(){
           int[]a= new int[]{1,2,3};
           Random rnd= new Random();
           System.out.println(a[rnd.nextInt(a.length)]);
       }
}

-1
package io.github.baijifeilong.tmp;

import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Stream;

/**
 * Created by BaiJiFeiLong@gmail.com at 2019/1/3 下午7:34
 */
public class Bar {
    public static void main(String[] args) {
        Stream.generate(() -> null).limit(10).forEach($ -> {
            System.out.println(new String[]{"hello", "world"}[ThreadLocalRandom.current().nextInt(2)]);
        });
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.