วิธีสุ่มเลือกองค์ประกอบจากอาร์เรย์


103

ฉันกำลังมองหาวิธีการเลือกหมายเลขแบบสุ่มจากอาร์เรย์จำนวนเต็ม

ตัวอย่างเช่นฉันมีอาร์เรย์new int[]{1,2,3}ฉันจะเลือกตัวเลขแบบสุ่มได้อย่างไร


คำตอบ:


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

2
ใช่ แต่คุณต้องบอกว่านั่นgeneratorคือตัวอย่างของjava.util.Random
stivlo

27
ฉันจะไม่สร้างRandom()ทุกครั้งที่คุณเรียกใช้ฟังก์ชัน: ตัวสร้างแบบสุ่มควรมีประวัติ หากไม่เป็นเช่นนั้นก็สามารถคาดเดาได้อย่างมาก ไม่ใช่ปัญหา แต่อย่างใดในกรณีนี้ - แต่ควรกล่าวถึงว่าarray[(int)(System.currentTimeMillis() % array.length)]ดีพอ ๆ กับโซลูชันที่เสนอ
เช้า

7
@alf นั่นยังห่างไกลจากสิ่งที่ดีพอ ๆ กับโซลูชันที่เสนอ new Random()พยายามที่จะสร้างตัวอย่างที่มีเมล็ดพันธุ์ที่แตกต่างกันกว่าใด ๆ Randomที่สร้างขึ้นก่อนหน้านี้ แนวทางของคุณจะพังทลายอย่างน่ากลัวเพียงแค่เรียกใช้ฟังก์ชันสองครั้งในเวลาอันสั้น
aioobe

1
@ ทั้งระบบบางระบบไม่มีนาฬิกาที่เที่ยงตรงเป็นมิลลิวินาทีซึ่งอาจขัดขวางตัวเลือกบางอย่างหากgcd(array.length,clockAccuracy)!=1
วงล้อประหลาด

3
ฉันเพิ่งสังเกตเห็นการแจ้งเตือนว่าฉันลดคะแนนคำตอบนี้ - ฉันต้องคลิกโดยบังเอิญ น่าเสียดายที่อินเทอร์เฟซไม่ยอมให้ฉันยกเลิก (มันบอกว่าฉันไม่สามารถเปลี่ยนการโหวตได้เว้นแต่จะแก้ไขคำตอบ ... ) ดังนั้นขอโทษ Chris Dennett
Peter Hanley

13

คุณสามารถใช้เครื่องกำเนิดไฟฟ้าแบบสุ่มเพื่อสร้างดัชนีแบบสุ่มและส่งคืนองค์ประกอบที่ดัชนีนั้น:

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

9

หากคุณกำลังจะได้รับองค์ประกอบแบบสุ่มหลาย ๆ ครั้งคุณต้องแน่ใจว่าตัวสร้างตัวเลขสุ่มของคุณเริ่มต้นเพียงครั้งเดียว

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

3

ใช้java.util.Randomเพื่อสร้างตัวเลขสุ่มระหว่าง 0 และความยาวอาร์เรย์: random_numberจากนั้นใช้ตัวเลขสุ่มเพื่อรับจำนวนเต็ม:array[random_number]



2

คุณยังสามารถใช้

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(รวม)


Math.random () ส่งคืนค่าสองเท่าไม่ใช่ int ถ้าจะมีก็จะมีค่า 0 และ 1 ที่เป็นไปได้เพียง 2 ค่า
Akshay R.

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แพ็คเกจ


0

ลองดูคำถามนี้:

ฉันจะสร้างจำนวนเต็มแบบสุ่มภายในช่วงเฉพาะใน Java ได้อย่างไร

คุณจะต้องสร้างตัวเลขสุ่มจาก 0 เป็นจำนวนเต็มของคุณ - 1. จากนั้นรับ int ของคุณจากอาร์เรย์ของคุณ:

myArray[myRandomNumber];

0

คุณยังสามารถลองใช้แนวทางนี้ ..

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)หน่วยความจำ ...
Jaroslaw Pawlak

ใช่คุณพูดถูกมันจะดีกว่าที่จะทำตามความซับซ้อนของเวลาและอวกาศ
Ravi Sapariya

-1

Java มีคลาส Random ในแพ็คเกจ java.util โดยใช้มันคุณสามารถทำสิ่งต่อไปนี้:

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

หวังว่านี่จะช่วยได้!


-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)]);
        });
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.