【问题标题】:srand function in CC中的srand函数
【发布时间】:2010-03-07 06:25:28
【问题描述】:

我正在尝试在嵌入式 C 中编写随机数生成函数,其中无法包含 math.h 文件。这就是为什么我不能使用种子srand 功能。

除了时间之外,还有其他方法可以播种吗?

【问题讨论】:

  • 获得好的种子价值取决于您的平台(硬件和操作系统,如果正在使用的话)。请包含该信息。
  • 没关系; <math.h> 没有声明 srand();那是在<stdlib.h>,所以你仍然可以使用'srand()'(因为你没有说你不能包含<stdlib.h>)。

标签: c srand


【解决方案1】:

考虑使用 Mersenne Twister,来源例如here -- 比传统的线性同余生成器质量高很多,周期极长,在大量近期学术文献中得到深入研究和祝福。

【讨论】:

  • 但问题在于为生成器播种,而且,据说,MT 也必须播种。
  • @sbi,当然,和init_genrand 在我指出的来源中进行播种(“用种子初始化mt[N]”是函数在来源中的注释所说的方式),尽管你还有更丰富的init_by_array 替代品。我的观点是,Mersenne Twister 比线性同余要好得多(例如,如果您可以保存和恢复计算的状态,那么巨大的周期减少了“编译时间”之外的播种需求)。
【解决方案2】:
  1. srand 位于 stdlib.h,而不是 math.h。要随时间播种,请包含 time.h 以使用 time(NULL),而不是 math.h。我不明白这有什么关系。
  2. 如果randsrand 不可用,您可以自己创建一个,例如LCGMersenne twister
  3. 如果速度和安全性不是问题,您可以将当前 PRNG 状态存储在持久内存中,并在需要随机数时从该点重新启动。例如,MT19937 的周期为 219937 - 1,在没有重新播种的情况下,这对于正常用途来说应该足够了。
  4. 如果确实需要播种,任何尺度上不恒定的任何东西都可以用作种子。

【讨论】:

  • 哎呀对不起...我不是说 math.h 我的意思是说 time.h 我可以包含 stdlib.h 但 d prob 是种子
  • @blossum:编辑您的问题以澄清。
【解决方案3】:

考虑看看through this 讲座,可能会给你一些想法(和代码)。 pdf 经历了几个不同的选项,甚至给出了一些代码。

【讨论】:

    【解决方案4】:

    我正在尝试在嵌入式 C 中编写随机数生成函数,其中无法包含 math.h 文件。这就是为什么我不能使用种子srand 功能。

    srand() 通常使用time() 播种,并且在<time.h> 中定义,而不是在<math.h> 中定义。

    除了时间之外,还有其他方法可以播种吗?

    当然,你可以用任何你想要的东西来播种。这取决于您的平台可用的内容。

    【讨论】:

    • 我正在研究微控制器 89c51...d 我只能看到 nw 是外部硬件,如噪声发生器或定时器...你知道任何软件方式吗?
    • 嘿,谢谢大家...我已经完成了该代码:) 我是这个 stackoverflow 家族的新手...所以请继续发帖...我也会尝试。 :) 再次感谢。
    • @blossum44:由于您是新来的,您可能需要花几分钟时间来学习这里的规则。 SO 不仅仅是另一个论坛,它的工作方式有点不同。这些规则之一是您应该接受其中一个答案作为帮助您解决问题的答案 - 如果有这样的答案。哦,我很想知道你是如何解决你的问题的。
    • 大家好!我在没有 srand() 或任何外部硬件的情况下解决了这个问题。我只是使用了 89C51 SFR 的位可寻址属性。而且我已经在keil中对89C51的头文件进行了一些更改。如果有人想要代码,我会把它贴在这里。 @sbi 嘿,谢谢你的帮助。因为我是新来的,所以我发现它很乱。我的意思是我看不到一侧的答案和另一侧的问题。你能帮我设置一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 2017-07-06
    相关资源
    最近更新 更多