如何在C中创建一个真正的随机数(IDE:MPLAB)

时间:2018-05-11 19:13:29

标签: c random build mplab microprocessors

我在PIC18F2550上进行游戏,我需要创建1到4之间的随机数。 我已经发现rand()函数对于真正随机的数字很糟糕。 我已经尝试过srand(time(NULL)),这是主文件

#include <time.h>
#include <stdlib.h>
#include <stdio.h>
void main(void) {
    srand(time(NULL));
    init(); 
    while(timed_to_1ms()) {
        fsm_game();
    }
}

这是fsm_game.c文件

void randomSpawn(int time2) {
    if(counter%time2==0) { 
        int x = rand()%4 +1; // Makes number between 1 and 4
    }
}

当我尝试构建此内容时,我收到错误消息:

&#34;:0:错误:(499)未定义的符号:     _time(dist / default / production \ Dontcrash.production.obj)&#34;

我认为问题可能在于微处理器并不知道时间,所以如果是这样的话,我该怎么做才能解决这个问题?

3 个答案:

答案 0 :(得分:1)

要初始化随机数发生器,您可以使用PIC的ADC读取浮动引脚上的电压,并使用srand()设置种子。

此外,您可以在每次程序启动时将种子保存到EEPROM,并从EEPROM读取前一个种子值,将其与ADC值相结合,以降低可预测性。 - 我认为这对于一场比赛来说已经足够了,否则我认为这太粗糙了。

[vivek@centosnode1 python]$ cat test.csv
#cyclone#twister#thunderstorm#supercell#wind|#weatherradar#storm#waterspout#tropicalcyclone#hurricane|#typhoon#snowstorm
  

我认为问题可能在于微处理器没有这个问题   “知道时间”,所以如果是这样的话,我该怎么做才能解决这个问题   问题

时间通常用微控制器上的RTC测量,因此如果可以使用RTC,则取决于您的硬件(RTC通常需要石英谐振器和备用电池以保持其一直运行,一些微处理器使用外部RTC)。由于大多数情况下微控制器上只使用一个小型C库,time()通常不可用,您需要自己读出RTC寄存器。 - 它也可用于初始化PRNG。

答案 1 :(得分:0)

由于您的PIC没有硬件RNG,因此您必须购买软件PRNG。是的,许多C库中的一个不是很好(虽然许多现代编译器正在变得更好)。对于小型嵌入式系统,我喜欢使用Marsaglia的XOR转换:

static uint32_t rng_state;
uint32_t rng_next() {
    rng_state ^= (rng_state << 13);
    rng_state ^= (rng_state >> 17);
    rng_state ^= (rng_state << 5);
    return rng_state - 1;
}

只需将rng_state设置为初始值(0以外),就可以实现上述目的。

答案 2 :(得分:0)

  

“任何试图通过确定性手段产生随机数的人当然都生活在罪恶的状态中。” - John von Neumann

互联网上有真正的随机数来源,例如LavaRnd

只要没有连接麦克风,也可以从计算机的麦克风插孔中获取一些物理随机输入。这将产生热噪声,可用作TRNG的基础。最好收集大量数据,至少是安全性的五十倍或更多位,并使用高质量的加密散列函数提取熵。您需要进行实验,具体取决于您的设备提供的熵数。

更复杂的是Fortuna或类似的完整实现,它从许多来源收集熵。

最昂贵的是在卡上购买真正的随机源并安装它。