我在使用奇怪的代码结构时遇到了一些麻烦,经过 2 小时的尝试和错误后,我似乎找不到问题的答案。
我有 2 个变量和一个带有一些子数组的数组结构(这对以后很重要)系统太大无法发布完整代码所以这里是问题部分:
$counter= 10;
$times = 20;
//Random 1 / 0
while($times > 0){
$number = rand(0,1);
if($number == 1) {
$counter++;
} else {
$counter--;
}
$times--;
}
所以这很简单,但是问题是开始时为 10 的 $total 也必须以 10 结束,因此必须有 10 次 1
和 0
的 10 倍.
我尝试使用以下方法解决它:
$number = 0;
if ($counter > 0) {
$number = 1;
$counter--;
}
这很有效并且是一个简单的解决方案,但请参阅“加法 1”
但这必须是随机的。这些位置中的每一个在实际程序中都是一个数组,因此无法对数组进行混洗。
TLDR:我只需要打乱数组的一部分,或者必须随机生成 0 or 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 次“我”=> 1
- 10 次“我”=> 0
- 如果“X”出现 2 次,请参见上面的代码示例:
最佳答案
最简单的解决方案就是执行 Fisher-Yates Shuffle .
它是这样工作的:
- 在数组中随机选择一个元素作为最后一个。将它与最后一个交换,这样正确的事情现在就在最后。
- 在最后一个以外的任意位置选择元素作为最后一个。将它与最后一个交换,这样正确的事情现在就在最后。
- 重复向上移动数组,直到您选择了每个位置的内容。
关于php - 根据计数器随机化,计数器以与开始时完全相同的值结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49389017/