我想选择一个随机的脉冲宽度调制引脚每次循环重复。Arduino UNO中能够进行脉宽调制的管脚为:3、5、6、11、10、9。我试过rnd(),但它给了我一个范围内的线性值,与TrueRandom.Random(1,9)相同。

最佳答案

好吧,至少有两种方法。
第一种(可能也是最好的)方法是将这些值加载到一个大小为6的数组中,生成一个从0到5的数字,并从数组中的那个位置获取值。
换句话说,psedo代码如下:

values = [3, 5, 6, 9, 10, 11]
num = values[randomInclusive(0..5)]

在实际实现伪代码方面,我将看到如下内容:
int getRandomPwmPin() {
    static const int candidate[] = {3, 5, 6, 9, 10, 11};
    static const int count = sizeof(candidate) / sizeof(*candidate);
    return candidate[TrueRandom.random(0, count)];
}

还有一种天真的方法,就是生成一个范围内的数字,然后简单地扔掉那些不符合您的规范的数字(即,返回并获取另一个)。这实际上是一种劣质的方法,因为在某些情况下,获得一个合适的数字可能需要更长的时间。从技术上讲,如果没有合适的值出现,它甚至可能需要无限长的时间。
这将遵循(psedo代码)的思路:
num = -1  // force entry into loop
while num is not one of 3, 5, 6, 9, 10, 11:
    num = randomInclusive(3..11)

变成:
int getRandomPwmPin() {
    int value;
    do {
        value = TrueRandom.random(3, 12);
    } while ((value == 4) || (value == 7) || (value == 8));
    return value;
}

如前所述,前一种解决方案可能是最好的。我把后者包括在内只是为了提供信息。
(a)是的,我知道。在足够长的时间内,统计数据几乎可以保证你会得到一个有用的值。别再对我的夸张吹毛求疵了

关于c++ - 在Arduino中选择随机的pwm引脚,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39503414/

10-12 18:49