代码之家  ›  专栏  ›  技术社区  ›  Mona Coder

从数组中选择两个不等于给定值的唯一随机数

php
  •  1
  • Mona Coder  · 技术社区  · 6 年前

    我怎么选择 两个独特 随机排列并检查 不平等 是否预先选择一个(默认值)?例如,我有一个月数组,比如

     $months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun","Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
    

    还有一个月 $alreadyin = "Feb"; 现在我需要选择两个不等于 $alreadyin ?

    <?php
        $alreadyin = "Feb";
        $months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun","Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
        $rand_months = array_rand($months, 2);
    ?>
    
    2 回复  |  直到 6 年前
        1
  •  4
  •   AbraCadaver    6 年前

    计算差额(得到非 $alreadyin )然后随机选择2:

    $rand_months = array_rand(array_diff($months, [$alreadyin]), 2);
    

    您还可以搜索和删除 阿雷德林 :

    unset($months[array_search($alreadyin, $months)]);
    $rand_months = array_rand($months, 2);
    

    array_rand 从数组中返回随机键,因此可能需要类似以下内容:

    foreach($rand_months as $key) {
        echo $months[$key];
    }
    

    要使用第一个示例获取实际月份名称,请对数组进行无序排列并切片2:

    $months = array_diff($months, [$alreadyin]);
    shuffle($months);
    $rand_months = array_slice($months, 0, 2);
    

    或者使用第二个示例:

    unset($months[array_search($alreadyin, $months)]);
    shuffle($months);
    $rand_months = array_slice($months, 0, 2);
    
        2
  •  0
  •   Ibu    6 年前

    您可以使用这个简单的过程。获取随机值,检查它们是否匹配,如果不匹配则重复。

    function getUniqueMonth( $alreadyin ) {
        $months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun","Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
    
        while( true ) {
            $rand_months = array_rand( $months, 2 );
            if ( !in_array( $alreadyin, $rand_months ) ) {
                return $rand_months;
            }
        }
    }
    

    为了安全起见,您可以添加一个计数器,以确保计算机不会永远保持循环。