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:
public static int getRandom(int[] array) {
int rnd = new Random().nextInt(array.length);
return array[rnd];
}
generatorbunun bir örnek olduğunu söylemelisinizjava.util.Random
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.
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.
gcd(array.length,clockAccuracy)!=1
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];
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)];
}
}
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
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.
Şu soruya bir göz atın:
Java'da belirli bir aralıkta rastgele tamsayıları nasıl üretirim?
0'dan tamsayılarınızın uzunluğuna kadar rastgele bir sayı oluşturmak isteyeceksiniz - 1. Ardından dizinizden int'inizi alın:
myArray[myRandomNumber];
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();
}
}
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 ...?
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)]);
}
}
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)]);
});
}
}