কিভাবে একটি অ্যারের বাইরে এলোমেলো মান পেতে?


123

আমার কাছে একটি অ্যারে আছে $ran = array(1,2,3,4);

আমার এই অ্যারের বাইরে এলোমেলো মান অর্জন করতে হবে এবং এটি একটি ভেরিয়েবলে সংরক্ষণ করতে হবে, আমি এটি কীভাবে করব?

উত্তর:


232

আপনি ঠিক করতে পারেন:

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

আপনার যখন কোনও সহযোগী অ্যারে থাকে তখন এটি করার উপায়।


11
এই মন্তব্য অনুসারে array_randএটি হওয়া উচিত হিসাবে এলোমেলো নয়
টিমো হুভিনেন

1
অথবা আপনি এই প্যাকেজটির প্রয়োজন এবং ব্যবহার করতে পারেনarray_rand_value
মার্জ করুন ze

10
যেহেতু পিএইচপি .1.১, মার্সেনarray_rand() টুইস্টার জেনারেটর ব্যবহার করে: র্যান্ড () এলটিজড এমটি_আর্যান্ড () এবং শ্রেনড () এলিট করে এমটি_স্রান্ড () । অনুশীলনে এটি এখন যথেষ্ট ভাল হওয়া উচিত।
গ্রাস ডাবল

32

পিএইচপি কেবল তার জন্য একটি ফাংশন সরবরাহ করে: অ্যারে_আরেন্ড ()
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তাই এটি লেখার দরকার নেই।
নবী KAZ

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 টি আইটেম রয়েছে। আরও সঠিকভাবে যদিও: $ অ্যারে [এমটি_আর্যান্ড (0, গণনা ($ অ্যারে)]

2
এর, আমি মনে করি আপনি mt_rand বলতে চেয়েছিলেন (0, গণনা ($ রান) - 1)
জোশ ডেভিস

পিএইচপি মন্তব্য অনুসারে array_randএটি যতটা এলোমেলো নয়, তত mt_randপছন্দ করা হয়
টিমো হুভিনেন

1
পুরো issetঅংশটি কী? এটি যাইহোক সাহসী অ্যারেগুলির জন্য ব্যর্থ হবে।
লুক কাজিন্স 18'15

আমি জানি না, তবে এই ক্ষেত্রে mt_randপরিবর্তে ব্যবহার করার সময় randমনে হয় কিছু আইটেম অন্যের চেয়ে বেশি পছন্দ হয়
user151496


14

নীচের মত আপনার অ্যারে থেকে একটি এলোমেলো কী নির্বাচন করতে আপনি অ্যারে_র্যান্ড ফাংশনটি ব্যবহার করতে পারেন।

$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()কীগুলি বদলান না (পিএইচপি 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()সম্ভবত ব্যবহারের জন্য আরও উপযুক্ত।
রিনোগো

আমি মনে করি আপনার প্রয়োজনীয়তাগুলি নির্ভর করে, আমার ক্ষেত্রে, বিতরণ খুব গুরুত্বপূর্ণ ছিল এবং কম্পিউটেশনাল ওভারহেড ছিল না।
Asciiom

5

সরাসরি মূল্য পেতে অ্যারে ফ্লিপিংয়ের মাধ্যমে আরেকটি পদ্ধতি।

টুকিটাকি

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

array_randরিটার্ন কী মান না। সুতরাং, আমরা কী হিসাবে মানকে উল্টিয়ে দিচ্ছি।

দ্রষ্টব্য: পিএইচপি কী সর্বদা একটি অনন্য কী হতে পারে, সুতরাং অ্যারেটি ফ্লিপ করা হলে, কী হিসাবে সদৃশ মানটি ওভাররাইট করা হবে।


কেন শুধু না $array[array_rand($array)];?
রিনোগো

@ রিনোগো এটি খুব কার্যকর, এটি ইতিমধ্যে উপরে উত্তর দিয়েছে। এটি আপনার উত্তর থেকে কিছুটা আলাদা, 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
এলফুর ওয়েজ

প্রথম $ র্যান্ড মানগুলি সম্পর্কে। মূল অ্যারেটির মান 1 থেকে 4 অবধি রয়েছে has দ্বিতীয় $ র‌্যান্ডটি 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()কেবলমাত্র পিএইচপি 7, তবে পিএইচপি 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"));

পিএইচপি <7.1.0 এ, array_rand()ব্যবহার করে rand(), তাই সুরক্ষা বা ক্রিপ্টোগ্রাফি সম্পর্কিত কোনও কিছুর জন্য আপনি এই ফাংশনটি চান না। পিএইচপি 7.1.0+ এ, যেহেতু এ্যালাইজড rand()হয়েছেmt_rand() সেহেতু উদ্বেগ ছাড়াই এই ফাংশনটি ব্যবহার করুন ।


0

আমি আমার উত্তরটি @ ইলাফুরওয়েজের কার্যকারিতাটি বন্ধ করে দিচ্ছি। আমি এটি ব্যবহার করার চেষ্টা করেছি তবে আমি যখন রিটার্ন অবজেক্টটি সংশোধন করার চেষ্টা করেছি তখন এটি রেফারেন্স ইস্যুতে চলছে। আমি তার ফাংশনটি পাস করে রেফারেন্স দিয়ে ফিরে যেতে আপডেট করেছি। নতুন ফাংশনটি হ'ল:

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

আরও প্রসঙ্গে, আমার প্রশ্নটি দেখুন / পাসওয়ার্ড অবজেক্ট + অবজেক্ট অব অবজেক্টের রেফারেন্সগুলি কাজ করছে না at


0

র্যান্ডম মান ফর্ম অ্যারে পাওয়ার সহজ উপায় ।

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

এখন প্রতিবার আপনি অ্যারে থেকে বিভিন্ন রঙ পাবেন ।


-5

আপনি নিম্নলিখিত হিসাবে একটি অ্যারের বাইরে একটি এলোমেলো নম্বর পান:

$randomValue = $rand[array_rand($rand,1)];

4
অ্যারে_র্যান্ড () একটি এলোমেলো কী প্রদান করে, এলোমেলো মান নয়।
reko_t
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.