伪代码到c++代码

Pseudo code to C++ code

本文关键字:代码 c++ 伪代码      更新时间:2023-10-16

我需要一些帮助来将这个伪代码转换为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;
}

我认为这可能是正确的,但我不明白他想让我"选择数组中位置I的项目"的部分。

使用标准库函数可以更好地做到这一点吗?是的。至少,

temp = RandomizeArray[i];
RandomizeArray[i] = RandomizeArray[j];
RandomizeArray[j] = temp;

全部替换为

std::swap(RandomizeArray[i], RandomizeArray[j]);

整个过程在某种程度上被取代了(但不是完全取代)。几乎可以肯定的是,std::random_shuffle是一个不同的备份算法,但这完全违背了练习的目的。

除非考官会说:"哦!他认出了这个算法,并提出了一个节省时间的替代方案!太好了!太好了!"寻找这些类型的老板。为他们工作通常更有趣。

无论如何……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和更好的有许多有趣的玩具来生成更好的随机数。uniform_int_distribution可能是您想要的。