根据计数器进行随机化,计数器以与

时间:2018-03-20 16:06:35

标签: php algorithm counter

嗨,我有一个奇怪的代码结构的麻烦,我似乎无法在2小时的尝试和错误后找到问题的答案。

我有2个变量和一个带有一些子数组的数组结构(以后是导入的)系统要大到发布完整代码所以这里是问题部分:

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

while($times > 0){
    $number = rand(0,1);
    if($number == 1) {
        $counter++;
    } else {
        $counter--;
    }
$times--;
}

所以这很简单,但问题是,总开始时10美元的总数也必须以10结束,因此必须是1的10倍和{{1}的10倍}。

我尝试使用以下方式解决它:

0

哪个工作并且是一个简单的解决方案,但请参阅'添加1`

但这必须随机化。而这些可能性中的每一个都是在实际程序中的一个数组,因此数组不是一个选项。

TLDR:我只需要对数组的一部分进行洗牌,或者必须使用第一个代码示例中的给定代码随机生成$number = 0; if ($counter > 0) { $number = 1; $counter--; } 。说实话,我现在不知道如何做到这一点,所以任何帮助都会受到赞赏。

提前致谢。

增加1:

0 or 1

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

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:

预期结果:

$x = rand(1, 100)
  • 10次'I'=> 1
  • 10次'I'=> 0
  • 如果'X'出现2次,请参阅上面的代码示例:

2 个答案:

答案 0 :(得分:2)

最简单的解决方案是只做一个Fisher-Yates Shuffle

就是这样:

  1. 将数组中随机位置的元素选为最后一个。与最后一个交换,以便正确的事情现在持续。
  2. 在最后一个以外的任意位置选择元素作为最后一个。与最后一个交换,以便正确的事情现在持续。
  3. 重复向上移动阵列,直到您选择了每个位置的内容。

答案 1 :(得分: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 = count($yourSample);
$newIndexes = [];


for ($i = 0; $i < $total; $i++) {
 $randItem = array_rand($yourSample);
 $newIndexes[] = $yourSample[$randItem];
 unset($yourSample[$randItem]);
}

//echo '<pre>';
//var_dump($newIndexes);

这适合你的问题,对吧?

更新1:

<?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());