我需要一些帮助才能将这个伪代码转换为c ++代码
RandomizeArray(String: array[])
Integer: max_i = *Upper bound of array*
For i = 0 To max_i - 1
// Pick the item for position i in the array.
Integer: j = *pseudorandom number between i and max_i inclusive*
*Swap the values of array[i] and array[j]*
Next i
End RandomizeArray
我试过这段代码,但似乎我做错了。还是正确的?
char RandomizeArray[];
int max_i = 10;
for(int i=0; i < max_i; i++)
{
char temp;
temp = RandomizeArray[i];
int j = rand() % max_i + i;
RandomizeArray[i] = RandomizeArray[j];
RandomizeArray[j] = temp;
}
我认为这可能是正确的,但我不理解他希望我去的部分&#34;在数组中选择位置i的项目。&#34;
答案 0 :(得分:1)
使用标准库函数可以做得更好吗?当然好。 至少,
temp = RandomizeArray[i];
RandomizeArray[i] = RandomizeArray[j];
RandomizeArray[j] = temp;
全部替换为
std::swap(RandomizeArray[i], RandomizeArray[j]);
整个过程被std::random_shuffle family排序(但不完全。几乎肯定是一种不同的支持算法),但这完全违背了练习的要点。
除非考官要去,“哦!他认出了这个算法,并建议节省时间!优秀!非常好!”寻找这些类型的老板。他们通常更有乐趣。
无论如何...... OP的解决方案是对伪代码的正确解释吗?
没有
查看int j = rand() % max_i + i;
并在继续浏览i的值时运行j的可能值范围。
i = 0 : [0 .. max_i]
i = 1 : [1 .. max_i + 1]
i = 2 : [2 .. max_i + 2]
注意上限正在移动,违反了伪代码的合同。从i = 1开始,j可能在RandomizeArray的范围之外,并且只会从那里开始更有可能。
稍作修改,int j = rand() % (max_i - i) + i;
i = 0 : [0 .. max_i]
i = 1 : [1 .. max_i]
i = 2 : [2 .. max_i]
额外注意:rand
很糟糕。 C++11 and better have a number of fun toys for generating much better random numbers。 uniform_int_distribution可能就是你想要的。