【问题标题】:PHP shuffle like mysql order by rand(seed)PHP shuffle 像 mysql 一样按 rand(seed) 排序
【发布时间】:2015-06-02 15:49:50
【问题描述】:

如何在 PHP 中对数组进行随机播放,但在插入或删除元素时保持随机播放的顺序,就像 mysql order by rand(seed) 一样? 一种忽略数组长度的Fisher-Yates shuffle算法。

假设您有一个包含 A、B、C 的数组并运行以下代码:

SELECT * 
FROM (
  SELECT 'A' AS value 
  UNION 
  SELECT 'B' AS value 
  UNION 
  SELECT 'C' AS value) AS T order by rand(123)

结果将是 B、C、A。

现在如果你将 D 添加到元素列表中:

SELECT * 
FROM (
  SELECT 'A' AS value 
  UNION 
  SELECT 'B' AS value 
  UNION 
  SELECT 'C' AS value 
  UNION 
  SELECT 'D' AS value) AS T order by rand(123)

结果将是 D、B、C、A。

将元素 E 添加到列表中:

SELECT * 
FROM (
  SELECT 'A' AS value 
  UNION 
  SELECT 'B' AS value 
  UNION 
  SELECT 'C' AS value 
  UNION 
  SELECT 'D' AS value 
  UNION 
  SELECT 'E' AS value) AS T order by rand(123)

结果将是 D、B、C、E、A。

当您将元素“D”添加到数组时,Fisher-Yates 将提供完全不同的顺序,而 rand(seed) 的 mysql 顺序将在已经随机排序的列表中的某处插入元素“D”。

【问题讨论】:

  • 您的意思是:您获取初始列表并“随机播放”。然后,作为单独的步骤,您插入或删除“随机位置”中的项目,但不再重新排列列表?
  • 您能分享一下您想要实现的目标吗?
  • 假设我有 80 个高级汽车销售列表,每页显示 10 个。我需要它们全天随机(种子=当天),但是当客户添加新列表时,我想保持相同的随机顺序并在其他列表中插入新列表而不给新元素更多权重,否则所有客户会删除/插入他们的列表以到达顶部。

标签: php mysql random shuffle


【解决方案1】:

您可以用类似于以下的方式来模仿 sort-by-rand 行为:

function sort_by_rand($ary, $seed) {
    srand($seed);
    $tmp = array_map(function($x) { return [rand(), $x]; }, $ary);
    sort($tmp);
    return array_map(function($x) { return $x[1]; }, $tmp);
}

结果:

$ary = ['A', 'B', 'C'];
print_r(sort_by_rand($ary, 100)); // CBA

$ary = ['A', 'B', 'C', 'D'];
print_r(sort_by_rand($ary, 100)); // CBAD

$ary = ['A', 'B', 'C', 'D', 'E'];
print_r(sort_by_rand($ary, 100)); // CBAED

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    相关资源
    最近更新 更多