Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.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_Algorithm_Counter - Fatal编程技术网

Php 根据计数器随机化,计数器以与开始时完全相同的值结束

Php 根据计数器随机化,计数器以与开始时完全相同的值结束,php,algorithm,counter,Php,Algorithm,Counter,我遇到了一个奇怪的代码结构问题,经过两个小时的反复尝试,我似乎找不到问题的答案 我有2个变量和一个带有一些子数组的数组结构(这对以后的工作很重要)系统太大,无法发布完整的代码,所以这里是问题的部分: $counter= 10; $times = 20; //Random 1 / 0 while($times > 0){ $number = rand(0,1); if($number == 1) { $counter++; } else {

我遇到了一个奇怪的代码结构问题,经过两个小时的反复尝试,我似乎找不到问题的答案

我有2个变量和一个带有一些子数组的数组结构(这对以后的工作很重要)系统太大,无法发布完整的代码,所以这里是问题的部分:

$counter= 10;
$times = 20;
//Random 1 / 0

while($times > 0){
    $number = rand(0,1);
    if($number == 1) {
        $counter++;
    } else {
        $counter--;
    }
$times--;
}
所以这很简单,但问题是$total在开始时是10,也必须在10结束,所以必须有10倍的
1
和10倍的
0

我尝试使用以下方法解决此问题:

$number  = 0;
if ($counter > 0) { 
    $number = 1; 
    $counter--;
}
这是一个简单的解决方案,但参见“添加1`

但这必须是随机的。而这些位置中的每一个都在实际的程序中是一个数组,所以洗牌数组不是一个选项

TLDR:我只需要洗牌数组的一部分,或者在第一个代码样本中随机生成
0或1
。老实说,我现在不知道该怎么做,所以我非常感谢你的帮助

补充1:

array(
      array('I' => 1, 'X' => '7'),  
      array('I' => 1, 'X' => '7'),  
      array('I' => 1, 'X' => 'value'), 
      array('I' => 1, 'X' => 'value'), 
      array('I' => 1, 'X' => 'value'),
      array('I' => 1, 'X' => 'value'),
      array('I' => 1, 'X' => 'value'),
      array('I' => 1, 'X' => 'value'),
      array('I' => 1, 'X' => 'value'),
      array('I' => 1, 'X' => 'value'),
      array('I' => 0, 'X' => 'value'),
      array('I' => 0, 'X' => 'value'),
      array('I' => 0, 'X' => 'value'),
      array('I' => 0, 'X' => 'value'),
      array('I' => 0, 'X' => 'value'),
      array('I' => 0, 'X' => 'value'),
      array('I' => 0, 'X' => 'value'),
      array('I' => 0, 'X' => 'value'),
      array('I' => 0, 'X' => 'value'),
      array('I' => 0, 'X' => 'value'),
);
每个值可以出现2次(不会总是出现2次),如果是这种情况,则2个值中的一个必须为'I'=>1和'I'=>0,但X也填充了一个随机值:

$x = rand(1, 100)
这是实际的结构对不起,如果我不清楚最初的职位,现在我的问题更清楚,我想

补充2:

预期结果:

//This is correct
'I' => 1, 'X' => 7
'I' => 0, 'X' => 7

//This is not correct:

'I' => 1, 'X' => 7
'I' => 1, 'X' => 7

//This is not correct
'I' => 0, 'X' => 7
'I' => 0, 'X' => 7
  • 10次“I”=>1
  • 10次“I”=>0
  • 如果“X”出现2次,请参见上面的代码示例:
$yourSample=[
0 => 0, 1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0, 6 => 0, 7 => 0, 8 => 0, 9 => 0, 
10 => 1, 11 => 1, 12 => 1, 13 => 1, 14 => 1, 15 => 1, 16 => 1, 17 => 1, 18 => 1, 19 => 1
];
$total=计数($yourSample);
$newIndexes=[];
对于($i=0;$i<$total;$i++){
$randItem=array_rand($yourSample);
$newIndexes[]=$yourSample[$randItem];
未设置($yourSample[$randItem]);
}
//回声';
//var_dump($newindex);
它适合你的问题,对吗

更新1:

$yourSample=[
0 => 0, 1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0, 6 => 0, 7 => 0, 8 => 0, 9 => 0, 
10 => 1, 11 => 1, 12 => 1, 13 => 1, 14 => 1, 15 => 1, 16 => 1, 17 => 1, 18 => 1, 19 => 1
];
$total=计数($yourSample);
$newIndexes=[];
对于($i=0;$i<$total;$i++){
$randItem=array_rand($yourSample);
$newIndexes[]=$yourSample[$randItem];
未设置($yourSample[$randItem]);
}
//回声';
//var_dump($newindex);
它适合你的问题,对吗

更新1:


最简单的解决方案就是做一个简单的测试

其工作原理如下:

  • 在数组中的任意位置拾取最后一个元素。将其与最后一个交换,以便正确的事情现在是最后一个
  • 在除“最后一个到最后一个”之外的任意位置拾取图元。将其与最后一个交换,以便正确的事情现在是最后一个
  • 重复向上移动阵列,直到选择了每个位置的内容

  • 最简单的解决方法就是做一个简单的测试

    其工作原理如下:

  • 在数组中的任意位置拾取最后一个元素。将其与最后一个交换,以便正确的事情现在是最后一个
  • 在除“最后一个到最后一个”之外的任意位置拾取图元。将其与最后一个交换,以便正确的事情现在是最后一个
  • 重复向上移动阵列,直到选择了每个位置的内容

  • 嗯,这可能真的有效是的,因为它是数组的最深层。我会试试这个嗯,我会在我原来的问题中添加一些东西,因为我忘记了一些重要的东西,好吧,但是你可以看看随机存在的数组,这比我的答案简单。shuffle();在这里不起作用,因为我的eddited问题中的“I”和“X”正好在下面填充。你能解释一下结果的正确/错误情况吗?嗯,这可能真的起作用,因为它是数组的最深层。我会试试这个嗯,我会在我原来的问题中添加一些东西,因为我忘记了一些重要的东西,好吧,但是你可以看看随机存在的数组,这比我的答案简单。shuffle();在这里不起作用,因为我的eddited问题中的“I”和“X”正好在下面。你能解释一下结果的对错情况吗?哦,这是一种很好的方法,我不知道这个“Fisher-Yates Shuffle”我会试试。哦,这是一种很好的方法,我不知道这个“Fisher-Yates Shuffle”我试试看。
    $yourSample = [
      0 => 0, 1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0, 6 => 0, 7 => 0, 8 => 0, 9 => 0, 
      10 => 1, 11 => 1, 12 => 1, 13 => 1, 14 => 1, 15 => 1, 16 => 1, 17 => 1, 18 => 1, 19 => 1
    ];
    
    $total = count($yourSample);
    $newIndexes = [];
    
    
    for ($i = 0; $i < $total; $i++) {
     $randItem = array_rand($yourSample);
     $newIndexes[] = $yourSample[$randItem];
     unset($yourSample[$randItem]);
    }
    
    //echo '<pre>';
    //var_dump($newIndexes);
    
    <?php
    
    function getRandomX($sample, $spe)
    {
      $rand = mt_rand(0, 100);
      foreach ($sample as $element) {
         if ($element['X'] == $rand and $spe['I'] == $element['I']) {
            $rand = getRandomX($sample, $spe);
         }
      }
    
      return $rand;
    }
    
    
    function makeResult()
    {
      $sample = array_merge(
          array_fill(0, 10, ['I' => 1, 'X' => null]),
          array_fill(0, 10, ['I' => 0, 'X' => null])
      );
      shuffle($sample);
    
      foreach ($sample as &$value) {
          $value['X'] = getRandomX($sample, $value);
      }
    
      return $sample;
    }
    
    echo '<pre>';
    var_export(makeResult());