Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 按可预测的顺序洗牌项目_Php_Sorting_Random_Sequence - Fatal编程技术网

Php 按可预测的顺序洗牌项目

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[

我有10000个ID,它们最初是以标准的升序方式排序的。 我需要以一种特定的方式洗牌这些ID,以便以后可以复制生成的序列

显然,如果我使用rand或mt_rand,每次的顺序都是不同的,所以我需要某种方法,可以用可预测的结果来洗牌项目

以下是我以前尝试过的:

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];}