在 Contiki 中计算泊松数据包生成时间时出现奇怪的 logf 行为 OS

Strange logf behavior when calculating Poisson packet generation times in Contiki OS

我的目标是使用 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's 并且我意识到它经常生成 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 as -2.2 和 nextTime 应该是4.5。这让我感到困惑,因为当我将 inner2 设置为常数值时,nextTime 会被正确计算。但正是这个值导致 nextTime 之前为 0.000。我真的很好奇,为什么它会以这种方式发生。顺便说一句,我知道不支持在 Contiki 中打印浮点数,我使用了两种不同的解决方案来正确打印这些浮点值 (How to print floating point value using putchar? and https://sourceforge.net/p/contiki/mailman/message/25936733/) 。

我很惊讶你可以使用 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();
}

所以它 return unsigned short,不管发生什么。如果 RAND_MAX 没有很好地定义,你就会溢出,给你一个带符号的数字。投射到 unsigned 就可以了。

非常感谢您的回复和帮助。我想我跳过了 random_rand() 的使用,尽管我在其他源文件中使用过它。似乎使用普通的 rand() 而不是 Contiki random_rand() 导致了一个问题,我不知道后台发生了什么。无论如何,它解决了问题。谢谢。