【问题标题】:C++ Arduino - Random Function doesn't workC++ Arduino - 随机函数不起作用
【发布时间】:2019-12-22 23:46:51
【问题描述】:

您好 C++ 开发人员和 StackOverflow 用户!

下面的代码是我做的,但是由于某种原因,随机函数不起作用,或者输出的结果总是相同的值“1”,我做错了什么吗?我应该如何解决这个问题?

  void setup()           
  {
  int randNumber;
  int i;

  randNumber = random(2);
  Serial.println(randNumber);
  pinMode(PIEZO, OUTPUT);
  delay(3000);

  if (randNumber == 0)
  {
    for (i = 0; i < 105; i++)                                       
    {
      tone(PIEZO, notes[i], time[i]);                                
      delay(time[i]);
    }
  }
  else if (randNumber == 1)                                     
    for (i = 0; i < 116; i++)                                       
    {
      tone(PIEZO, Snowman_Notes[i], Snowman_Rhythm[i]);                                  
      delay(Snowman_Rhythm[i]);
    }
}
void loop()                                                      
{
}

【问题讨论】:

  • 您在使用random之前是否randomSeed(analogRead(0));
  • 不,我没有...我必须输入 randomSeed(analogRead(0));在使用随机函数之前?我会试试的! :) 感谢您的评论。
  • 是的,analogRead 应该来自未连接的引脚,因此您会得到随机噪声来为生成器播种。
  • @super 非常感谢您的帮助,您的解释很有道理!我修复了我的源代码,并且随机函数工作正常! :) 圣诞快乐!

标签: c++ random arduino


【解决方案1】:

您需要先随机播种。使用randomSeed(seed)

在使用任何 PRNG(伪随机数生成器)之前,您必须为生成器播种。种子每次都应该不同,否则你会一遍又一遍地得到相同的序列。也就是说,如果您拨打randomSeed(2);,然后拨打random(),您每次都会以相同的顺序获得相同的号码。对于给定的种子,数字的模式是相同的。如 cmets 中所述,每个程序仅种子一次

因此,您需要每次都为 PRNG 播种不同的编号。取自website,您可以只使用randomSeed( analogRead(pinNum) );,其中pinNum 应该是未连接的引脚。

【讨论】:

  • 非常感谢您的详细解释,我添加了 randomSeed(analogRead(pinNum));我的代码中的一行,它就像一个魅力!圣诞快乐,新年快乐!
猜你喜欢
  • 1970-01-01
  • 2014-04-27
  • 2014-05-12
  • 2011-01-19
  • 2010-11-05
  • 1970-01-01
  • 2018-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多