Php 根据计数器随机化,计数器以与开始时完全相同的值结束
我遇到了一个奇怪的代码结构问题,经过两个小时的反复尝试,我似乎找不到问题的答案 我有2个变量和一个带有一些子数组的数组结构(这对以后的工作很重要)系统太大,无法发布完整的代码,所以这里是问题的部分: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 {
$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());