我的目标是使用MSP430实验板(Exp430)平台生成符合Contiki Cooja泊松分布的数据包(同样的问题适用于Zolertia Z1微粒,它也有基于MSP430的MCU)。我包括数学库并将泊松分布编码为:
float nextTime = (-2.000) * logf((rand() / (float)RANDOM_RAND_MAX));
其中代码背后的实际公式是-a * ln(rand),其中rand必须是0到1之间的浮点数。我创建了一个模拟并测试了生成的 nextTime 我意识到它经常产生0.000。然后我将代码分成小块,看看是什么值导致0.000生成为:
float inner1 =(float)( (rand() / (float)RANDOM_RAND_MAX));
float inner2 = logf(inner1);
float nextTime = (float) (-2.000)*inner2;
导致nextTime被计算为0.000的 inner1 的值之一是0.135。然后我将 inner1 设置为0.135并重新加载模拟,我得到的是 inner2 为-2.2和 nextTime 为4.5应该是。这使我感到困惑,因为当我将 inner2 设置为常量值时, nextTime 会被正确计算。但确切地说,此值导致 nextTime 先前为0.000。我真的很好奇它,为什么它会以这种方式发生。顺便说一下,我知道不支持Contiki中的打印浮动,我使用了两种不同的解决方案来正确打印这些浮动值(How to print floating point value using putchar?和https://sourceforge.net/p/contiki/mailman/message/25936733/)。
答案 0 :(得分:1)
我很惊讶你可以使用rand()
在contiki中,要生成兰特数,您需要使用random_rand()
并包括:#include "lib/random.h"
编辑:有关详细说明:
代码random_rand()
:
unsigned short
random_rand(void)
{
/* In gcc int rand() uses RAND_MAX and long random() uses RANDOM_MAX=0x7FFFFFFF */
/* RAND_MAX varies depending on the architecture */
return (unsigned short)rand();
}
无论发生什么,它都会返回unsigned short。如果RAND_MAX没有很好地定义,你将有溢出,给你一个签名号码。投射到无符号就行了。
答案 1 :(得分:0)
非常感谢您的回复和帮助。我想我跳过使用random_rand()虽然在其他源文件中我曾经使用过它。看似使用普通的rand()而不是Contiki random_rand()导致了一个问题,我不知道后台发生了什么。无论如何,它解决了这个问题。谢谢。