من آرایه ای دارم به نام $ran = array(1,2,3,4);
من باید یک مقدار تصادفی از این آرایه بگیرم و آن را در یک متغیر ذخیره کنم، چگونه می توانم این کار را انجام دهم؟
من پاسخ خود را بر اساس ویژگی @ÓlafurWaage قرار می دهم. من سعی کردم از آن استفاده کنم اما هنگامی که سعی کردم شیء برگشتی را تغییر دهم با مشکلات مرجع مواجه شدم. من عملکرد آن را بهروزرسانی کردهام تا با مرجع ارسال و برگردد. ویژگی جدید:
تابع &random_value(&$array, $default=null) ($k = mt_rand(0, count($array) - 1); if (isset($array[$k])) (بازگرداندن $array[$k]; ) else ($ پیش فرض را برگردانید؛ ) )
سوال من را در قسمت ارسال/بازگشت ارجاع به یک شی ببینید + تغییر یک شی برای اطلاعات بیشتر کار نمی کند
$value = آرایه $;
می توانید از تابع array_rand برای انتخاب یک کلید تصادفی از آرایه خود مانند زیر استفاده کنید.
$array = array("یک"، "دو"، "سه"، "چهار"، "پنج"، "شش"); echo $array;
یا می توانید از توابع rand و count برای انتخاب یک شاخص تصادفی استفاده کنید.
$array = array("یک"، "دو"، "سه"، "چهار"، "پنج"، "شش"); echo $array;
$ تصادفی = $ran;
در صورت نیاز به مقدار، به عنوان یک تابع نیز مفید است.
تابع random_value ($array, $default=null) ($k = mt_rand(0, count($array) - 1)؛ بازگشت isset($array[$k])؟ $array[$k]: $default; )
آیا انتخاب شما پیامدهای امنیتی دارد؟ اگر چنین است، از random_int() و array_keys() استفاده کنید. (random_bytes() فقط PHP 7 است، اما یک polyfill برای PHP 5 وجود دارد).
تابع random_index(آرایه $source) ($max = count($source) - 1؛ $r = random_int(0, $max)؛ $k = array_keys ($source)؛ $k[$r]؛ )
کاربرد:
$array = [ "apple" => 1234, "boy" => 2345, "cat" => 3456, "dog" => 4567, "echo" => 5678, "fortune" => 6789 ]; $i = random_index ($array); var_dump([$i، $array[$i]]);
تابع array_random($array, $amount = 1) ($keys = array_rand($array, $amount)؛ if ($amount == 1) ($array[$keys]; ) $results = ; foreach ($keys) به عنوان $key) ( $results = $array[$key]; ) $results را برگردانید؛)
کاربرد:
$items = ["foo"، "bar"، "baz"، "lorem"=>"ipsum"]; array_random ($items); // "bar" array_random($items, 2); // ["foo"، "ipsum"]
چند نکته:
ویرایش:ویژگی لاراول از آن زمان بهطور محسوسی رشد کرده است، به Arr::random() Laravel 5.4 مراجعه کنید.
تابع array_random($array, $number = null) ($ requested = ($number === null) ? 1: $number; $count = count($array)؛ if ($requested > $count) (پرتاب جدید \ RangeException ("شما آیتم های ($درخواست شده) را درخواست کردید، اما فقط ($count) آیتم ها موجود است."); ) if ($number === null) ($array; ) if ((int) $number == = 0) ( return ; ) $keys = (آرایه) array_rand($array, $number)؛ $results = ؛ foreach ($keys به عنوان $key) ($results = $array[$key]; ) $results را برگرداند. )
چند نکته برجسته:
rand(1,N) اما بدون احتساب آرایه (a,b,c,..)
آیا قبلاً یک تابع داخلی وجود دارد که من نمی دانم یا باید خودم آن را پیاده سازی کنم (چگونه؟)؟
به روز رسانی
یک راه حل واجد شرایط باید طلا داشته باشد، صرف نظر از اینکه اندازه آرایه حذف شده بزرگ است یا خیر.
هیچ عملکرد داخلی وجود ندارد، اما شما تو می توانیبرای انجام این:
تابع randWithout($from، $to، آرایه $exceptions) ( sort($exceptions); // به ما اجازه می دهد از break استفاده کنیم؛ در foreach به طور قابل اعتماد $number = rand($from, $to - count($exceptions));/ / یا mt_rand() foreach ($exceptions به عنوان $exception) ( if ($number >= $exception) ( $number++; // جبران شکاف ) else /*if ($number< $exception)*/ { break; } } return $number; }
این در ذهن من نیست، بنابراین ممکن است از پولیش استفاده کند - اما حداقل شما نمی توانید در یک سناریوی حلقه بی نهایت، حتی به صورت فرضی، قرار بگیرید.
توجه داشته باشید: اگر $ استثنا باشد، تابع شکسته می شود اگزوزهامحدوده شما - برای مثال، فراخوانی randWithout(1, 2, array(1,2)) یا randWithout(1, 2, array(0,1,2,3)) چیزی معقول (بدیهی است) تولید نمی کند. در صورتی که عدد برگردانده شده خارج از محدوده $from - $ باشد، بنابراین گرفتن آن آسان است.
اگر $exceptions تضمین شده است که قبلا مرتب شده است، sort($exceptions); قابل حذف است.
آب نبات چشم: حداقل تجسم الگوریتم.
من فکر نمی کنم چنین عملکرد داخلی وجود داشته باشد. احتمالاً باید خودتان آن را کد کنید.
برای کدنویسی این دو راه حل دارید:
بسته به آنچه نیاز دارید و چرا این رویکرد ممکن است جایگزین جالبی باشد.
$numbers = array_diff(range(1, N), array(a, b, c)); // یا (پاسخ واقعی نیست، اما بسته به شرایط شما می تواند مفید باشد) shuffle($numbers); // $numbers اکنون یک آرایه با مرتبسازی تصادفی است که شامل تمام اعداد مورد علاقه شما است // یا: $x = $numbers; // $x اکنون یک عدد تصادفی است که از مجموعه اعداد مورد علاقه شما انتخاب شده است
بنابراین اگر لازم نیست هر بار مجموعهای از اعداد بالقوه تولید کنید، بلکه یکبار مجموعهای را تولید کنید و سپس یک دسته از اعداد تصادفی را از همان مجموعه انتخاب کنید، این ممکن است راه خوبی باشد.
آسانترین راه …
باید آرایه ای از مکان های گمشده را محاسبه کنید تا بتوانید یک موقعیت تصادفی را در یک آرایه پیوسته به طول M = N - #از استثناها انتخاب کنید و به راحتی آن را با سوراخ ها به آرایه اصلی بازگردانید. این به زمان و فضایی برابر با آرایه عبوری نیاز دارد. من php را از سوراخی در زمین نمی دانم، بنابراین مثال متن کد نیمه شبه را ببخشید.
اکنون، این فقط یک طرح است، شما باید با انتهای آرایه ها سر و کار داشته باشید، و اگر چیزی به شکل 0 یا 1 و تمام آن جاز نمایه شود. اگر باهوش هستید، میتوانید آرایه Offset را در همان لحظه از نسخه اصلی محاسبه کنید، اما این کمی واضحتر است.
شاید برای پاسخ دیر باشد، اما من این قطعه کد را جایی در ذهنم پیدا کردم، در حالی که سعی می کردم داده های تصادفی را از یک پایگاه داده بر اساس یک شناسه تصادفی به جز تعدادی عدد دریافت کنم.
$excludedData = array(); // این عدد حذف شده شما است $maxVal = $this->db->count_all_results("game_pertanyaan"); // حداکثر عدد را بر اساس پایگاه داده من دریافت کنید $randomNum = rand(1, $maxVal); // اولین شروع را انجام دهید، فکر میکنم میتوانید این را مستقیماً در پارامتر while > in_array قرار دهید، به نظر میرسد که کار میکند، این به شما بستگی دارد while (in_array($randomNum, $excludedData)) ($randomNum = rand(1, $maxVal؛ ) $randomNum؛ //عدد تصادفی شما به استثنای تعدادی که انتخاب می کنید
اعداد تصادفی بخشی جدایی ناپذیر از برنامه نویسی هستند، به خصوص در مورد سیستم های امنیتی. به عنوان مثال، رمزنگاری متکی بر تولید مقادیر تصادفی برای تولید اعدادی است که قابل پیشبینی نیستند. البته در PHP، اعداد تصادفی نقش بزرگی دارند: با کمک آنها میتوانیم توکن، نمک و مقادیر دیگر تولید کنیم.
تولید اعداد تصادفی بر اساس الگوریتم های خاص است. پارامتر ورودی که الگوریتم از آن شروع می شود می تواند یک مقدار تصادفی یا یک مقدار از پیش تعیین شده باشد.
در این مقاله، ما در مورد اعداد تصادفی صحبت خواهیم کرد: چگونه آنها تولید می شوند و کجا می توان از آنها استفاده کرد.
اعداد تصادفی نقش بزرگی در PHP دارند، زیرا اغلب برای اهداف مختلف استفاده می شود. اصولاً با امنیت مرتبط هستند. بر اساس آنها، نشانه های CSRF، کلیدهای API، مقادیر برای احراز هویت، مقادیر برای تنظیم مجدد رمزهای عبور و بسیاری موارد دیگر تولید می شوند. همه اینها به منظور غیرممکن کردن پیش بینی مقدار حاصل انجام می شود.
مهمترین مثال های استفاده از مقادیر تصادفی عبارتند از:
اعداد تصادفی مورد استفاده در مواردی که در بالا توضیح داده شد در PHP توسط شبه ژنراتورها تولید می شوند. چندین الگوریتم موجود است:
روش همگام خطی، هنگام استفاده از تابع ()lcg_value.
گرداب مرسن که توسط تابع mt_rand() استفاده می شود.
تابع rand() که از تابعی مشابه در زبان C استفاده می کند.
در واقع، این توابع اعداد تصادفی را برمی گردانند، بلکه اعدادی را به گونه ای توزیع می کنند که شبیه توابع تصادفی به نظر می رسند. دنباله این اعداد به عدد تصادفی زیرین الگوریتم اجرا شده بستگی دارد.
اعداد پایه یا بردارهای چنین اعدادی مجموعه داده هایی هستند که برای تولید اعداد تصادفی استفاده می شوند. مولدهای اعداد شبه تصادفی فقط بر اساس آنها کار می کنند. اگر مهاجمی این عدد پایه را بداند، در آینده میتواند مقادیر اعداد تصادفی شما را پیشبینی کند.
در PHP می توانید اعداد پایه را به دو صورت تنظیم کنید. اولین مورد استفاده از تابع mt_srand() است. این روش عمدتاً در تست های واحد یک سری تصادفی استفاده می شود. راه دوم این است که اجازه دهید PHP خودش اعداد پایه را تولید کند. از نسخه 4.2، PHP این قابلیت را فراهم می کند. متعاقباً از Mersenne Vortex برای تولید اعداد تصادفی استفاده خواهد شد.
PHP بسته به سیستم عامل یک عدد پایه تولید می کند. در پلتفرم های لینوکس، می توانید از توابع mcrypt_create_iv() یا openssl_pseudo_random_bytes() در /dev/urandom استفاده کنید. ویندوز یک شبه ژنراتور ویژه را ارائه می دهد که می توان از طریق توابع openssl_pseudo_random_bytes() و mcrypt_create_iv() به آن دسترسی داشت.
از آنجایی که اعداد تصادفی نقش بزرگی در ساختن برنامه های کاربردی وب ایمن دارند، باید در مورد نحوه کار آنها بیشتر بدانیم. اگر خودتان می خواهید اعداد پایه برای شبه ژنراتورها تولید کنید، مطمئن شوید که روش های شما قابل اعتماد هستند.
با این تابع می توانیم یک عنصر (یا عناصر) تصادفی از یک آرایه را انتخاب کنیم. بله دقیقا عنصر یا عناصر! ممکن است یک عنصر یا چندین عنصر وجود داشته باشد. همه چیز بستگی به وظیفه ای دارد که با آن روبرو هستید.
با این حال، در اینجا باید توجه داشت که تابع نه مقدار عنصر، بلکه کلید آن (یا کلیدها، در صورت وجود چندین عنصر) را برمی گرداند.
به عنوان پارامترهای داخل پرانتز، تابع عبارت است از: نام آرایه ای که با آن کار می کنیم و تعداد عناصری که باید انتخاب شوند.
به طور کلی، همه چیز ساده است! و وقتی به همه اینها با مثال نگاه کنیم آسانتر خواهد بود.
بیایید با انتخاب یک عنصر تصادفی از آرایه شروع کنیم.
بیایید تصور کنیم که در جایی در بالای سایت خود می خواهیم چند نقل قول نمایش دهیم. البته، نقل قول ها باید تغییر کنند. هر بار که از سایت خود بازدید می کنید، می خواهید کاربر یک نقل قول جدید ببیند.
همانطور که احتمالاً حدس زده اید، ساده ترین راه برای پیاده سازی این است که تمام نقل قول های موجود را در یک آرایه قرار دهید و سپس یک عنصر تصادفی را از این آرایه انتخاب کرده و روی صفحه نمایش دهید.
هر چه تعداد نقل قول ها در آرایه بیشتر باشد، احتمال تکرار آنها کمتر می شود.
اما برای مثال من زیاد زحمت نمی کشم و 7 جمله را در آرایه ام قرار می دهم.
در مرحله بعد، من باید یک متغیر ایجاد کنم که در آن نتیجه تابع array_rand () را وارد کنم. در پرانتز، این تابع دو آرگومان خواهد داشت: نام آرایه ما و تعداد عناصر تصادفی مورد نیاز.
همانطور که قبلاً گفتم، تابع مقدار عنصر را بر نمیگرداند، بلکه کلید آن (یا شماره در لیست) را برمیگرداند. بنابراین، کلید عنصر تصادفی در متغیر ذخیره می شود.
پس از آن، فقط باید مقدار عنصر مورد نظر را روی صفحه نمایش دهم. برای انجام این کار، نام آرایه و در براکت نام متغیر خود را که حاوی یک کلید تصادفی است، مشخص می کنم.
همین. به کد زیر نگاه کنید و فکر می کنم بالاخره همه چیز را متوجه خواهید شد:
". $frases[$rand_frases].""; ?>
حالا بیایید خروجی برخی از عناصر آرایه تصادفی را تمرین کنیم.
در مورد یک عنصر، کلید آن برگردانده می شود و در مورد عناصر آرایه تصادفی متعدد، آرایه ای از کلیدها برگردانده می شود. از این قسمت خروجی را به صفحه نمایش خواهیم داد.
ابتدا یک آرایه ایجاد می کنیم که در آن 7 نام مختلف وارد می کنیم.
سپس یک متغیر ایجاد می کنیم که کار تابع ()array_rand در آن وارد می شود. فقط اکنون در پرانتز این تابع، عدد "2" را به عنوان آرگومان دوم نشان می دهیم. این بدان معنی است که ما به 2 عنصر تصادفی نیاز داریم.
نتیجه تابع در این وضعیت آرایه ای خواهد بود که شامل دو کلید تصادفی از عناصر آرایه اصلی ما است.
بنابراین، هنگام نمایش این روی صفحه، باید این را در نظر بگیرید و در پرانتز مربع نه فقط نام متغیر، بلکه نام متغیر، سپس براکت ها و شاخص آرایه را نشان دهید. از آنجایی که ما 2 عنصر داریم، در حالت اول ایندکس خواهد بود و در حالت دوم . (به یاد داشته باشید که نمایه سازی آرایه از "0" شروع می شود.)
همین. به کد نگاه کنید تا برای شما واضح تر شود:
$names = آرایه ("ماشا"، "ساشا"، "نادیا"، "میلا"، "آندری"، "سرگئی"، "آنتون"); $rand_names = array_rand($names,2); پژواک"
در نتیجه دو نام تصادفی روی صفحه نمایش داده می شود. هر بار که صفحه به روز می شود، نام ها تغییر می کنند.
منبع
چند بار از من پرسیده اند که چگونه این کار را انجام می دهم خروجی تصادفی نقل قولدر سایت شما در بلوک " نقل قول های هوشمندعلاوه بر این، من موفق شدم متوجه شوم که مشکل اینجا با سوء تفاهم مردم است. نحوه دریافت عنصر تصادفی از آرایه در php. کار ساده است، اما با این وجود، از آنجایی که سؤالاتی مطرح می شود، لازم است به آنها پاسخ داده شود.
من همون لحظه کد رو بهت میدم فرض کنید یک آرایه با مجموعه ای از نقل قول وجود دارد. و باید یکی از آنها را به صورت تصادفی انتخاب کنید و خروجی بگیرید:
$quotes = array(); // یک آرایه خالی را راه اندازی کنید
$quotes = "مواظب افکار خود باشید، آنها آغاز اعمال هستند."; // نقل قول اول
$quotes = "این باهوش ترین یا قوی ترین نیست که زنده می ماند، بلکه پذیراترین افراد برای تغییر هستند."; // نقل قول دوم
$quotes = "زندگی یک کوه است: آهسته بالا بروید، سریع پایین بروید."; // نقل قول سوم
$quotes = "مردم نمی خواهند ثروتمند باشند، مردم می خواهند ثروتمندتر از دیگران باشند."; // نقل قول چهارم
$number = mt_rand(0, count($quotes) - 1); // یک عدد تصادفی از 0 تا (طول آرایه منهای 1) شامل می شود
echo $quotes[$number]; // نقل قول خروجی
?>
نکته کلیدی این است گرفتن یک عدد تصادفی. تنها کاری که باید انجام دهید این است که مرزهای مناسبی را تعیین کنید. اگر نیاز به انتخاب یک عنصر تصادفی در کل طول آرایه دارید، این از است 0 قبل از ( طول آرایه منهای 1). و بعد فقط کشیدن عنصر از آرایه با شاخص تصادفی داده شده.
در مورد کار با نقل قول ها، بهتر است آنها را در یک پایگاه داده ذخیره کنید. در اصل، اگر سایت بسیار ساده است، در یک فایل متنی امکان پذیر است. اما اگر در یک پایگاه داده، پس از آن بهتر است استفاده کنید RAND()و حدکه در پرس و جوی SQLبه طوری که بلافاصله یک نقل قول واحد و تصادفی از پایگاه داده دریافت می کنید.