किसी सरणी से यादृच्छिक मान कैसे प्राप्त करें?


123

मेरे पास एक सरणी है जिसे कहा जाता है $ran = array(1,2,3,4);

मुझे इस सरणी से एक यादृच्छिक मूल्य प्राप्त करने और इसे एक चर में संग्रहीत करने की आवश्यकता है, मैं यह कैसे कर सकता हूं?

जवाबों:


232

आप भी कर सकते हैं:

$k = array_rand($array);
$v = $array[$k];

यह एक ऐसा तरीका है जब आपके पास एक सहयोगी सरणी होती है।


11
इस टिप्पणी के अनुसार यह array_randउतना यादृच्छिक नहीं है जितना कि होना चाहिए
टिमो हुओवेंन

1
या आप की आवश्यकता हो सकती इस पैकेज और उपयोगarray_rand_value
murze

10
चूंकि PHP 7.1, array_rand()Mersenne Twister जनरेटर का उपयोग करता है: rand () mt_rand () और srand () aliased से mt_srand () के लिए अन्य नाम । व्यवहार में यह अब पर्याप्त होना चाहिए।
ग्रास डबल

32

PHP केवल इसके लिए एक फ़ंक्शन प्रदान करती है: array_rand ()
http://php.net/manual/en/function.array-rand.php

$ran = array(1,2,3,4);
$randomElement = $ran[array_rand($ran, 1)];

3
array_randफ़ंक्शन के दूसरे तर्क का डिफ़ॉल्ट मान है 1इसलिए इसे लिखने की आवश्यकता नहीं है।
नबी

23

आप mt_rand () का उपयोग कर सकते हैं

$random = $ran[mt_rand(0, count($ran) - 1)];

यह एक फ़ंक्शन के रूप में अच्छी तरह से काम में आता है अगर आपको मूल्य की आवश्यकता है

function random_value($array, $default=null)
{
    $k = mt_rand(0, count($array) - 1);
    return isset($array[$k])? $array[$k]: $default;
}

4
Mt_rand (0, 3) होना चाहिए क्योंकि केवल 4 आइटम हैं। अधिक सही ढंग से हालांकि: $ array [mt_rand (0, count ($ array)]
reko_t

2
Err, मुझे लगता है कि आपका मतलब mt_rand (0, काउंट ($ भाग गया) - 1)
जोश डेविस

php टिप्पणियों के अनुसार array_randयह जितना होना चाहिए उतना यादृच्छिक नहीं है, इसलिए mt_randपसंद किया जाता है
Timo Huovinen

1
पूरे issetहिस्से में क्या है? यह वैसे भी सहयोगी सरणियों के लिए विफल होगा।
ल्यूक कजिन्स

मैं नहीं जानता कि क्यों, लेकिन जब इस मामले में उपयोग mt_randकरने के randलिए दूसरों की तुलना में कुछ आइटम पसंद करते हैं लगता है
user151496


14

आप अपने सरणी से नीचे की तरह एक यादृच्छिक कुंजी का चयन करने के लिए array_rand फ़ंक्शन का उपयोग कर सकते हैं।

$array = array("one", "two", "three", "four", "five", "six");
echo $array[array_rand($array, 1)];

या आप रैंडम इंडेक्स को चुनने के लिए रैंड और काउंट फ़ंक्शन का उपयोग कर सकते हैं।

$array = array("one", "two", "three", "four", "five", "six");
echo $array[rand(0, count($array) - 1)];

11

लारवेल से व्युत्पन्न Collection::random():

function array_random($array, $amount = 1)
{
    $keys = array_rand($array, $amount);

    if ($amount == 1) {
        return $array[$keys];
    }

    $results = [];
    foreach ($keys as $key) {
        $results[] = $array[$key];
    }

    return $results;
}

उपयोग:

$items = ['foo', 'bar', 'baz', 'lorem'=>'ipsum'];

array_random($items); // 'bar'
array_random($items, 2); // ['foo', 'ipsum']

कुछ नोट:

  • $amountसे कम या बराबर होना चाहिए count($array)
  • array_rand()चाबियाँ फेरबदल नहीं करता है (चूंकि PHP 5.2.10, 48224 देखें ), इसलिए आपकी चुनी हुई वस्तुएं हमेशा मूल क्रम में रहेंगी। shuffle()जरूरत पड़ने पर बाद में इस्तेमाल करें ।


प्रलेखन: array_rand(),shuffle()


संपादित करें: लारवेल फ़ंक्शन तब से बड़े पैमाने पर विकसित हो गया है, लारवेल 5.4 देखें Arr::random()। यहाँ कुछ और विस्तृत है, बड़े हुए लारवेल फ़ंक्शन से लिया गया है:

function array_random($array, $number = null)
{
    $requested = ($number === null) ? 1 : $number;
    $count = count($array);

    if ($requested > $count) {
        throw new \RangeException(
            "You requested {$requested} items, but there are only {$count} items available."
        );
    }

    if ($number === null) {
        return $array[array_rand($array)];
    }

    if ((int) $number === 0) {
        return [];
    }

    $keys = (array) array_rand($array, $number);

    $results = [];
    foreach ($keys as $key) {
        $results[] = $array[$key];
    }

    return $results;
}

कुछ मुख्य बातें:

  • पर्याप्त आइटम उपलब्ध नहीं होने पर अपवाद फेंक दें
  • array_random($array, 1)एक आइटम का एक सरणी देता है ( # 19826 )
  • समर्थन मूल्य "0" मदों की संख्या के लिए ( # 20439 )

8

ऐसा array_randलगता है कि फ़ंक्शन को बड़े सरणियों पर असमान वितरण है, प्रत्येक सरणी आइटम को उठाया जाने की समान रूप से संभावना नहीं है। सरणी पर फेरबदल का उपयोग करना और फिर पहला तत्व लेने से यह समस्या नहीं होती है:

$myArray = array(1, 2, 3, 4, 5);

// Random shuffle
shuffle($myArray);

// First element is random now
$randomValue = $myArray[0];

यह एक बहुत यादृच्छिक तत्व प्राप्त करने के लिए सिर्फ एक अतिरिक्त कम्प्यूटेशनल "काम" है। अन्य उत्तर जो उपयोग करते mt_rand()हैं वे संभवतः कार्य के लिए बेहतर हैं।
रिनोगो

आपकी जरूरतों पर निर्भर करता है, मुझे लगता है। मेरे मामले में, वितरण बहुत महत्वपूर्ण था और कम्प्यूटेशनल ओवरहेड नहीं था।
असिओम

5

प्रत्यक्ष मान प्राप्त करने के लिए फ्लिपिंग सरणी के माध्यम से एक और दृष्टिकोण।

टुकड़ा

$array = [ 'Name1' => 'John', 'Name2' => 'Jane', 'Name3' => 'Jonny' ];
$val = array_rand(array_flip($array));

array_randवापसी कुंजी मूल्य नहीं। इसलिए, हम मान को कुंजी के रूप में दिखा रहे हैं।

नोट: PHP की कुंजी एक अद्वितीय कुंजी है, इसलिए जब सरणी फ़्लिप की जाती है, तो कुंजी के रूप में डुप्लिकेट मान को अधिलेखित कर दिया जाएगा।


सिर्फ क्यों नहीं $array[array_rand($array)];?
रिनोगो

@rinogo यह भी काम करता है, यह पहले से ही ऊपर जवाब दिया है। यह आपके उत्तर से थोड़ा अलग है, array_flipडुप्लिकेट को कुंजी के रूप में हटा दें और फिर परिणाम दें ... मतलब कोई डुप्लिकेट नहीं!
स्मार्टपाल

4
$rand = rand(1,4);

या, विशेष रूप से सरणियों के लिए:

$array = array('a value', 'another value', 'just some value', 'not some value');
$rand = $array[ rand(0, count($array)-1) ];

2
आपको इस सूची में पहला आइटम कभी नहीं मिलेगा और आप 4 के साथ सरणी के बाहर जाएंगे
urlafur Waage

पहला $ रैंड मूल्यों के बारे में है। मूल सरणी में 1 से 4 तक के मान हैं। दूसरा $ रैंड सरणी कुंजियों के बारे में है, 0 से 3.
जोश डेविस

3

मेरे मामले में, मुझे 2 मान प्राप्त करने होंगे कि वस्तुएं क्या हैं। मैं इस सरल उपाय को साझा करता हूं।

$ran = array("a","b","c","d");
$ranval = array_map(function($i) use($ran){return $ran[$i];},array_rand($ran,2));

2

क्या आपके चयन का कोई सुरक्षा निहितार्थ है? यदि हां, तो उपयोग करें random_int()और array_keys()। ( random_bytes()केवल PHP 7 है, लेकिन PHP 5 के लिए एक पॉलीफ़िल है )।

function random_index(array $source)
{
    $max = count($source) - 1;
    $r = random_int(0, $max);
    $k = array_keys($source);
    return $k[$r];
}

उपयोग:

$array = [
    'apple' =>   1234,
    'boy'   =>   2345,
    'cat'   =>   3456,
    'dog'   =>   4567,
    'echo'  =>   5678,
    'fortune' => 6789
];
$i = random_index($array);
var_dump([$i, $array[$i]]);

डेमो: https://3v4l.org/1joB1


2

यादृच्छिक कुंजी गूंज करने के लिए यादृच्छिक संख्या प्राप्त करने के लिए रैंड () का उपयोग करें। पूर्व में: 0 - 3

$ran = array(1,2,3,4);
echo $ran[rand(0,3)];


2

मुझे लघु सरणी के लिए एक पंक्ति संस्करण की आवश्यकता थी:

($array = [1, 2, 3, 4])[mt_rand(0, count($array) - 1)]

या यदि सरणी ठीक है:

[1, 2, 3, 4][mt_rand(0, 3]

2

ऑन-लाइनर:

echo $array[array_rand($array,1)]

हालांकि यह कोड इस प्रश्न का उत्तर दे सकता है, कि यह कोड क्यों और / या इस बारे में अतिरिक्त संदर्भ प्रदान करता है कि यह प्रश्न इसके दीर्घकालिक मूल्य में सुधार करता है।
β.βοιτ.βε

1

यह इन-लाइन सरणियों के साथ अच्छी तरह से काम करेगा। इसके अलावा, मुझे लगता है कि जब चीजें किसी समारोह में लपेटी जाती हैं तो चीजें बहुत अधिक और पुन: प्रयोज्य होती हैं।

function array_rand_value($a) {
    return $a[array_rand($a)];
}

उपयोग:

array_rand_value(array("a", "b", "c", "d"));

PHP <7.1.0 पर, array_rand()का उपयोग करता है rand(), तो आप सुरक्षा या क्रिप्टोग्राफी से संबंधित किसी भी चीज़ के लिए इस फ़ंक्शन को नहीं चाहते हैं। PHP 7.1.0+ पर, इस फ़ंक्शन का उपयोग तब तक बिना किसी चिंता के rand()करेंmt_rand()


0

मैं अपने उत्तर को ÓlafurWaage के फंक्शन से हटा रहा हूं। मैंने इसका उपयोग करने की कोशिश की थी, लेकिन जब मैं रिटर्न ऑब्जेक्ट को संशोधित करने की कोशिश कर रहा था, तो संदर्भ के मुद्दों में चल रहा था। मैंने पास करने और संदर्भ द्वारा वापस लौटने के लिए अपने फ़ंक्शन को अपडेट किया। नया कार्य है:

function &random_value(&$array, $default=null)
{
    $k = mt_rand(0, count($array) - 1);
    if (isset($array[$k])) {
        return $array[$k];
    } else {
        return $default;
    }
}

अधिक संदर्भ के लिए, ऑब्जेक्ट के लिए पासिंग / रिटर्निंग संदर्भ में मेरा प्रश्न देखें + ऑब्जेक्ट बदलने से काम नहीं हो रहा है


0

Randdom वैल्यू फॉर्म ऐरे पाने का एक सरल तरीका है ।

$color_array =["red","green","blue","light_orange"];
$color_array[rand(0,3)

अब हर बार आपको ऐरे से अलग रंग मिलेंगे ।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.