如何从数组中获取随机值?

Posted

技术标签:

【中文标题】如何从数组中获取随机值?【英文标题】:How to get random value out of an array? 【发布时间】:2010-12-11 05:38:26 【问题描述】:

我有一个名为$ran = array(1,2,3,4);的数组

我需要从这个数组中获取一个随机值并将其存储在一个变量中,我该怎么做?

【问题讨论】:

【参考方案1】:

您可以使用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;

【讨论】:

应该是 mt_rand(0, 3) 因为只有 4 个项目。不过更正确的是: $array[mt_rand(0, count($array)] 呃,我想你的意思是 mt_rand(0, count($ran) - 1) 根据 php cmets array_rand 没有应有的随机性,所以首选mt_rand 整个isset 部分有什么意义?无论如何,这对于关联数组都会失败。 我不知道为什么,但是在这种情况下使用mt_rand 而不是rand 似乎更喜欢某些项目而不是其他项目【参考方案2】:
$rand = rand(1,4);

或者,专门针对数组:

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

【讨论】:

你永远不会得到这个列表中的第一个项目,你会用 4 离开数组 第一个 $rand 是关于价值观的。原始数组的值范围是 1 到 4。第二个 $rand 是关于数组键,0 到 3。【参考方案3】:

你从一个数组中得到一个随机数如下:

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

【讨论】:

array_rand() 返回随机键,而不是随机值。【参考方案4】:

PHP 专门为此提供了一个函数:array_rand()http://php.net/manual/en/function.array-rand.php

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

【讨论】:

array_rand函数第二个参数的默认值为1,所以不用写了。【参考方案5】:

你也可以这样做:

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

当你有一个关联数组时,这是这样做的。

【讨论】:

据此comment array_rand 并不像应有的那样随机 或者你可以要求this package并使用array_rand_value 自 PHP 7.1 起,array_rand() 使用 Mersenne Twister 生成器:rand() aliased to mt_rand() and srand() aliased to mt_srand()。在实践中,它现在应该已经足够好了。【参考方案6】:

您可以使用 array_rand 函数从您的数组中选择一个随机键,如下所示。

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

或者您可以使用 rand 和 count 函数来选择随机索引。

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

【讨论】:

【参考方案7】:

array_rand 函数在大型数组上似乎分布不均,并非每个数组项都同样可能被选中。在数组上使用shuffle,然后取第一个元素就没有这个问题:

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

// Random shuffle
shuffle($myArray);

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

【讨论】:

不过,为了获得单个随机元素,需要进行大量额外的计算“工作”。使用mt_rand() 的其他答案可能更适合该任务。 我想这取决于您的需求。就我而言,分布非常重要,而计算开销则不是。【参考方案8】:
$value = $array[array_rand($array)];

【讨论】:

【参考方案9】:

我的答案基于@ÓlafurWaage 的功能。我尝试使用它,但在尝试修改返回对象时遇到了参考问题。我更新了他的函数以通过引用传递和返回。新功能是:

function &random_value(&$array, $default=null)

    $k = mt_rand(0, count($array) - 1);
    if (isset($array[$k])) 
        return $array[$k];
     else 
        return $default;
    

有关更多上下文,请参阅我的问题Passing/Returning references to object + changing object is not working

【讨论】:

【参考方案10】:

源自 Laravel 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()

编辑: 从那时起,Laravel 功能显着增长,请参阅 Laravel 5.4 的 Arr::random()。下面是更详细的内容,源自成熟的 Laravel 函数:

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)

【讨论】:

【参考方案11】:

您的选择是否有任何安全隐患?如果是这样,请使用random_int()array_keys()。 (random_bytes() 仅适用于 PHP 7,但有一个 polyfill for 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

【讨论】:

【参考方案12】:

使用 rand() 获取随机数来回显随机密钥。例如:0 - 3

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

【讨论】:

【参考方案13】:

另一种通过翻转数组获得直接值的方法。

片段

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

array_rand 返回键不是值。所以,我们将价值作为关键。

注意: PHP key 始终是唯一的 key,所以当数组翻转时,作为 key 的重复值将被覆盖。

【讨论】:

为什么不直接做$array[array_rand($array)]; @rinogo 这也有效,上面已经回答了。这与您的回答略有不同,array_flip 删除重复项作为键然后给出结果...意味着没有重复项! 要转义重复的键,您可以使用以下语法(在第二行):$array = [ 'Name1' => 'John', 'Name2' => 'Jane', 'Name3' => 'Jane' ]; $val = array_rand(array_flip(array_unique($array)));【参考方案14】:

一行:$ran[rand(0, count($ran) - 1)]

【讨论】:

【参考方案15】:

这将很好地与内联数组一起使用。另外,我认为将事物封装在一个函数中时会更整洁,更可重用。

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

用法:

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

在 PHP array_rand() 使用 rand(),因此您不希望将此函数用于与安全或密码学相关的任何事情。在 PHP 7.1.0+ 上,使用此函数无需担心,因为 rand() has been aliased to mt_rand()

【讨论】:

【参考方案16】:

就我而言,我必须获得 2 个值什么是对象。我分享这个简单的解决方案。

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

【讨论】:

【参考方案17】:

我需要一个短数组的行版本:

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

或者如果数组是固定的:

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

【讨论】:

【参考方案18】:

一种从数组中获取随机值的简单方法。

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

现在每次你都会从Array中得到不同的颜色。

【讨论】:

【参考方案19】:

在线:

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

【讨论】:

虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。【参考方案20】:

从数组中获取随机值。

function random($array)

    /// Determine array is associative or not
    $keys = array_keys($array);
    $givenArrIsAssoc = array_keys($keys) !== $keys;

    /// if array is not associative then return random element
    if(!$givenArrIsAssoc)
        return $array[array_rand($array)];
    

    /// If array is associative then 
    $keys = array_rand($array, $number);
    $results = [];
    foreach ((array) $keys as $key) 
        $results[] = $array[$key];
    
    return $results;

【讨论】:

以上是关于如何从数组中获取随机值?的主要内容,如果未能解决你的问题,请参考以下文章

从数组中获取随机值并在 DOM 中发布

IDL 中 如何从一个数组中随机取出3个数?

js 从数组中随机获取一个值

为啥从函数返回数组作为参数时,我会从函数中的数组中获取随机值? [复制]

如何从 C# 中的泛型类型数组中选择一组随机值?

jQuery 从字符串数组中选择一个随机值