ฉันกำลังมองหาวิธีการเลือกหมายเลขแบบสุ่มจากอาร์เรย์จำนวนเต็ม
ตัวอย่างเช่นฉันมีอาร์เรย์new int[]{1,2,3}ฉันจะเลือกตัวเลขแบบสุ่มได้อย่างไร
ฉันกำลังมองหาวิธีการเลือกหมายเลขแบบสุ่มจากอาร์เรย์จำนวนเต็ม
ตัวอย่างเช่นฉันมีอาร์เรย์new int[]{1,2,3}ฉันจะเลือกตัวเลขแบบสุ่มได้อย่างไร
คำตอบ:
public static int getRandom(int[] array) {
int rnd = new Random().nextInt(array.length);
return array[rnd];
}
generatorคือตัวอย่างของjava.util.Random
Random()ทุกครั้งที่คุณเรียกใช้ฟังก์ชัน: ตัวสร้างแบบสุ่มควรมีประวัติ หากไม่เป็นเช่นนั้นก็สามารถคาดเดาได้อย่างมาก ไม่ใช่ปัญหา แต่อย่างใดในกรณีนี้ - แต่ควรกล่าวถึงว่าarray[(int)(System.currentTimeMillis() % array.length)]ดีพอ ๆ กับโซลูชันที่เสนอ
new Random()พยายามที่จะสร้างตัวอย่างที่มีเมล็ดพันธุ์ที่แตกต่างกันกว่าใด ๆ Randomที่สร้างขึ้นก่อนหน้านี้ แนวทางของคุณจะพังทลายอย่างน่ากลัวเพียงแค่เรียกใช้ฟังก์ชันสองครั้งในเวลาอันสั้น
gcd(array.length,clockAccuracy)!=1
คุณสามารถใช้เครื่องกำเนิดไฟฟ้าแบบสุ่มเพื่อสร้างดัชนีแบบสุ่มและส่งคืนองค์ประกอบที่ดัชนีนั้น:
//initialization
Random generator = new Random();
int randomIndex = generator.nextInt(myArray.length);
return myArray[randomIndex];
หากคุณกำลังจะได้รับองค์ประกอบแบบสุ่มหลาย ๆ ครั้งคุณต้องแน่ใจว่าตัวสร้างตัวเลขสุ่มของคุณเริ่มต้นเพียงครั้งเดียว
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)];
}
}
หากคุณกำลังเลือกองค์ประกอบอาร์เรย์แบบสุ่มที่ต้องไม่สามารถคาดเดาได้คุณควรใช้java.security.SecureRandomแทน Random ซึ่งช่วยให้มั่นใจได้ว่าหากใครบางคนรู้จักตัวเลือกสุดท้ายพวกเขาจะไม่ได้เปรียบในการเดารายการต่อไป
หากคุณต้องการเลือกตัวเลขสุ่มจาก Object array โดยใช้ generics คุณสามารถกำหนดวิธีการได้ (Source Avinash Rในองค์ประกอบสุ่มจากสตริงอาร์เรย์ ):
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)];
}
}
ใช้java.util.Randomเพื่อสร้างตัวเลขสุ่มระหว่าง 0 และความยาวอาร์เรย์: random_numberจากนั้นใช้ตัวเลขสุ่มเพื่อรับจำนวนเต็ม:array[random_number]
ใช้คลาสสุ่ม :
int getRandomNumber(int[] arr)
{
return arr[(new Random()).nextInt(arr.length)];
}
คุณยังสามารถใช้
public static int getRandom(int[] array) {
int rnd = (int)(Math.random()*array.length);
return array[rnd];
}
Math.random()ส่งกลับdoubleระหว่าง0.0(รวม) ถึง1.0(เอกสิทธิ์)
การคูณด้วยarray.lengthจะให้doubleระหว่าง0.0(รวม) และarray.length(เอกสิทธิ์)
การส่งไปยังintจะปัดเศษให้คุณและจำนวนเต็มระหว่าง0(รวม) และarray.length-1(รวม)
เนื่องจากคุณมี java 8 วิธีอื่นคือการใช้ Stream API
new Random().ints(1, 500).limit(500).forEach(p -> System.out.println(list[p]));
1ค่า int ต่ำสุดที่สร้างขึ้น (รวม) ที่ไหนและ500เป็นค่าสูงสุด (เอกสิทธิ์) limitหมายความว่าสตรีมของคุณจะมีความยาว 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]));
สุ่มมาจากjava.utilแพ็คเกจ
ลองดูคำถามนี้:
ฉันจะสร้างจำนวนเต็มแบบสุ่มภายในช่วงเฉพาะใน Java ได้อย่างไร
คุณจะต้องสร้างตัวเลขสุ่มจาก 0 เป็นจำนวนเต็มของคุณ - 1. จากนั้นรับ int ของคุณจากอาร์เรย์ของคุณ:
myArray[myRandomNumber];
คุณยังสามารถลองใช้แนวทางนี้ ..
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)ความซับซ้อนของเวลาทำสำเนาสองครั้งโดยใช้หน่วยความจำทั้งหมด 3 เท่าของอาร์เรย์เริ่มต้นแม้ว่าปัญหาที่ OP ถามถึงจะสามารถแก้ไขได้ด้วยO(1)ความซับซ้อนของเวลาและO(1)หน่วยความจำ ...
Java มีคลาส Random ในแพ็คเกจ java.util โดยใช้มันคุณสามารถทำสิ่งต่อไปนี้:
Random rnd = new Random();
int randomNumberFromArray = array[rnd.nextInt(3)];
หวังว่านี่จะช่วยได้!
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)]);
});
}
}