【问题标题】:Random preset generator C programming随机预设发生器 C 编程
【发布时间】:2020-06-14 15:02:29
【问题描述】:

这里是初学者。对于工程学校,我正在学习如何用 C 编程。我的任务之一是设计一个有限状态机。因为我是一名吉他手,所以我想我用 C 语言做了一个吉他踏板模拟。 使用 switch case 语句,我已经到了可以在模拟中调整控件的地步。这个(假)踏板有 3 个旋钮(电平、音调、驱动),每个旋钮有 3 个位置(低、中、高)和一个脚踏开关,用于使踏板起作用。

为了增加趣味性,我想创建一个“随机”预设发生器,它应该在“现实世界”中像这样工作:你按下一个按钮,踏板就会产生一个信号输出,例如。电平高,音中,驱动低。可以这么说,按下按钮时有 3^3 种可能的结果。

如何在 C 中创建它?我可以想象我必须创建一个包含这些结果的表格并创建一个随机函数来使其工作。但这就是方式吗?

[编辑] 感谢 cmets 和一些进一步的挖掘,我开始明白我最初的想法对于 FSM 来说并不是一个很好的例子。然而,为了练习的目的,这真的无关紧要。学习过程的一部分是犯错误。在作业的反思部分,我将向导师解释这一点。我在 UML 中创建了状态图以进行澄清。 state chart

原始问题仍然存在:如何在 C 中创建随机预设生成器?

【问题讨论】:

  • 对我来说,解决方案不是通过状态机,因为按钮没有定义整体“状态”。你在一个有多个变量的公式前面
  • 如果你真的想要一个状态机,你只有 2 个状态,具体取决于脚踏开关,依此类推(如果我很了解它是如何工作的)。另请注意,状态机的主要功能不是结果,而是收入(例如,产生转换的事件和守卫)
  • 补充@bruno 所说的,状态机是关于符号序列的。如果符号的顺序无关紧要(您只关心 哪个 符号当前处于活动状态,而不关心先发送哪个符号,也不关心 20 个符号前发送了哪个符号),那么状态机什么也不做给你。
  • @MrGreenery 你可以说你想说的任何话,你也可以在里面塞入一个状态机,但这对你没有帮助,也没有简化或澄清问题。这是多余的,只会使您的方法复杂化。您有一些状态(开关的当前位置),并在当前信号上应用相应的转换。除非转换应该依赖于先前设置的开关的历史,否则状态机绝对不会为您做任何事情(即使如果您想要类似衰减的东西,您可能应该使用适当的过滤器来代替)。
  • 欢迎来到 SO。请花时间阅读stackoverflow.com/help/mcve 并编辑您的问题。

标签: c fsm


【解决方案1】:

关于剩下的原始问题,

C 标准头文件stdlib.h 提供了一个定义为int rand(void); 的函数,它产生一个介于0RAND_MAX 之间的伪随机整数,其中RAND_MAX 是一个宏定义为大整数常量(很可能是有符号int 可以容纳的最大正值)

为了确保程序的每次运行都有一组由rand() 函数生成的唯一值,您必须使用void srand(unsigned int); 函数为数字生成器播种,该函数也由stdlib.h 提供。在每次运行时为这个函数提供一个唯一的值,随机数生成器在每次运行时的行为应该不同。

为伪随机数生成器提供种子的一种常用方法是将time(NULL)(包括time.h)的结果传递给它,因为此函数以a 的形式返回实现对当前时间的最佳近似值time_t 这是一些实现定义的类型,用于存储当前时间。

回答你的问题很简短:

#include <stdlib.h>
#include <time.h>

int main(){
  int a, b, c;
  srand( (unsigned int) time(NULL) );
  a = rand() % 3;
  b = rand() % 3;
  c = rand() % 3;
...

可能值得注意的是,虽然rand() % a(其中a 是大于零且小于RAND_MAX 的某个整数)应该总是返回一个介于零和a-1 之间的整数,但这个结果只是真正均匀的当RAND_MAX 可以被a 整除时,分布在零和a-1 之间,但在您的情况下,a 低至 3,这应该不会产生显着差异。

【讨论】:

    猜你喜欢
    • 2014-06-07
    • 2010-10-28
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    相关资源
    最近更新 更多