Php 按可预测的顺序洗牌项目
我有10000个ID,它们最初是以标准的升序方式排序的。 我需要以一种特定的方式洗牌这些ID,以便以后可以复制生成的序列 显然,如果我使用rand或mt_rand,每次的顺序都是不同的,所以我需要某种方法,可以用可预测的结果来洗牌项目 以下是我以前尝试过的:Php 按可预测的顺序洗牌项目,php,sorting,random,sequence,Php,Sorting,Random,Sequence,我有10000个ID,它们最初是以标准的升序方式排序的。 我需要以一种特定的方式洗牌这些ID,以便以后可以复制生成的序列 显然,如果我使用rand或mt_rand,每次的顺序都是不同的,所以我需要某种方法,可以用可预测的结果来洗牌项目 以下是我以前尝试过的: public function pseudoRandomSort(&$ids, $var1) { $sorted = array(); foreach ($ids as $id) { $sorted[
public function pseudoRandomSort(&$ids, $var1)
{
$sorted = array();
foreach ($ids as $id) {
$sorted[md5($id.$var1)] = $id;
}
ksort($sorted);
$ids = array_values($sorted);
}
这种方法有效,但我正在寻找更优雅、更快的方法
UPD:感谢@Andrew提到$seed概念。
在此基础上,我提出了一种简单快速的方法,可以按可预测的顺序洗牌:
public function predictableShuffle(&$ids, $seed)
{
srand($seed);
shuffle($ids);
}
你在寻找或者至少是它的一个变种
你必须根据种子来洗牌。因为存储一个种子要比存储整个X数序列容易得多
最简单的实现如下所示:
$items = [1, 2, 3, 4];
function shuffleSeed(&$items, $seed) {
$items = array_values($items);
mt_srand($seed);
$count = count($items);
for ($i = $count - 1; $i > 0; $i--) {
$j = mt_rand(0, $i);
list($items[$i], $items[$j]) = [$items[$j], $items[$i]];
}
}
shuffleSeed($items, 3);
var_dump($items);
既然你说这里的性能很重要,这可能不好用,你就得混搭了。试一试,看看它的性能如何。您是否从数据库中获取这些id?我的意思是,它们的id来自表行吗?不,它们存储在文件中。你已经做了什么?那么,你想排序吗?不想排序?想随机化吗?函数名pseudoRandomSort充其量是可疑的。@AlexKapustin,我这样做了:公共函数pseudoRandomSort&$ids,$var1{$sorted=array;foreach$ids作为$id{$sorted[md5$id.$var1]=$id;}ksort$sorted;$ids=array\u values$sorted;}在共享主机上随机分配10000个ID大约需要0.02秒,我想知道是否有一种更快更优雅的方式谢谢!使用这种方法,在共享主机上大约需要0.01秒来随机分配10000个项目。这个时间是可以接受的。它看起来更优雅,比我以前使用的临时解决方案快2倍左右。我只是稍微最小化了代码:mt_sru和$seed;foreach数组_将$items设置为$i{$j=mt_rand0,$i;列出$items[$i],$items[$j]=array$items[$j],$items[$i];}