PHP cara mendapatkan nomor acak yang berbeda dari nilai array

Contoh: Saya memiliki array dengan 3 nilai:

0 = 1
1 = 4
2 = 5

Saya ingin mendapatkan nomor acak seperti

$random = rand(1, 5);

Tapi saya perlu mendapatkan nomor yang berbeda dari nilai array. Saya membutuhkannya untuk mengembalikan 2 atau 3.


person Rockman    schedule 09.04.2015    source sumber
comment
Jadi Anda memiliki rentang di mana Anda ingin mendapatkan nomor acak, tetapi tanpa nomor dari array Anda, bukan? Apakah Anda juga sudah mencoba sesuatu?   -  person Rizier123    schedule 10.04.2015
comment
Terima kasih atas jawabannya! Ini berhasil tetapi terkadang saya mendapatkan Kesalahan Fatal: Kesalahan fatal: Waktu eksekusi maksimum melebihi 30 detik   -  person Rockman    schedule 10.04.2015
comment
@Rockman Sudahkah Anda membaca komentar pertama saya^?   -  person Rizier123    schedule 10.04.2015
comment
Anda mengecualikan sebagian besar kemungkinan angka acak. Jadi terkadang dibutuhkan banyak percobaan sebelum memilih salah satu yang diperbolehkan.   -  person Barmar    schedule 10.04.2015


Jawaban (1)


Ini seharusnya berhasil untuk Anda:

(Di sini saya membuat rentang dari mana Anda mendapatkan nomor acak dengan range(). Lalu Saya menghilangkan nomor-nomor yang tidak Anda inginkan ini dengan array_diff(). Dan pada akhirnya Anda cukup menggunakan array_rand() untuk mendapatkan kunci acak/ nomor)

<?php

    $blacklist = [1, 4, 5];
    $range = range(1, 5);
    $randomArray = array_diff($range, $blacklist);
    echo $randomArray[array_rand($randomArray, 1)];

?>

keluaran:

2 or 3

EDIT:

Baru saja melakukan beberapa tolok ukur dan metode dengan loop jauh lebih lambat daripada kode di atas!

Saya membuat array (daftar hitam) dari 1...100'000 dan array angka acak dari 1...100'001.

Sehingga skrip tersebut hanya boleh membuat satu/nomor acak unik. Dengan metode loop Anda mendapatkan kesalahan:

Kesalahan fatal: Waktu eksekusi maksimum terlampaui 30 detik

Dan dengan kode yang diposting di atas rata-rata membutuhkan waktu 1,5 detik.

person Rizier123    schedule 09.04.2015
comment
Ini jauh lebih bagus daripada loop, ini seharusnya tidak menyebabkan kesalahan waktu terlampaui. - person Barmar; 10.04.2015
comment
@Barmar Terima kasih, Itu sebabnya saya mempostingnya ketika saya melihat kemungkinan penipuan, karena tidak ada jawaban seperti itu. - person Rizier123; 10.04.2015
comment
@Barmar Baru saja melakukan beberapa tolok ukur dan perbedaannya sangat besar! (lihat jawaban yang diperbarui) - person Rizier123; 10.04.2015
comment
@ Rizier123 Sekali lagi terima kasih! Ini berfungsi dengan baik, dan itulah yang saya cari. Saya tidak tahu array_diff ini. - person Rockman; 10.04.2015
comment
@Rockman Sama-sama! (BTW: Anda dapat menerima jawaban yang paling membantu Anda dan memecahkan masalah Anda (meta.stackexchange.com/q/5234) !) - person Rizier123; 10.04.2015
comment
Saya menerimanya sekarang, saya kira... Ini pertanyaan pertama saya di stackoverflow, saya masih belajar cara menggunakannya, hehe. - person Rockman; 10.04.2015
comment
@Rockman tidak masalah, nikmati hari Anda :D (FYI: Anda dapat mengikuti tur di sini: stackoverflow.com/tour dan lihat sedikit caranya situs ini berfungsi dan di mana semuanya berada) - person Rizier123; 10.04.2015