将C函数转换为Javascript

将C函数转换为Javascript,javascript,c,algorithm,Javascript,C,Algorithm,最终编辑:我错了。Redis文档中没有任何内容表明计数器仅达到255,约为100万。只是当点击量达到100万次时,计数器已达到255。案件结案。别再看了 我正在尝试从C移植到JS。它使用莫里斯计数器 常数: LFU_INIT_VAL=5。看到了 lfu\u log\u系数=10。看见 找到了C函数 根据上表,如果lfu\u log\u因子为10,当达到100万次点击时,计数器应为255。然而,当运行我的JS代码时,计数器在~300k的点击次数中始终达到255次。我做错了什么 下面是一次JS代码

最终编辑:我错了。Redis文档中没有任何内容表明计数器仅达到255,约为100万。只是当点击量达到100万次时,计数器已达到255。案件结案。别再看了


我正在尝试从C移植到JS。它使用莫里斯计数器

常数:

LFU_INIT_VAL=5
。看到了

lfu\u log\u系数=10
。看见

找到了C函数

根据上表,如果
lfu\u log\u因子
为10,当达到100万次点击时,计数器应为255。然而,当运行我的JS代码时,计数器在~300k的点击次数中始终达到255次。我做错了什么

下面是一次JS代码运行的结果,将实际命中率与预期命中率进行比较,系数为10:

  • 新计数器:10,i=149
    (预计为100,超过49)
  • 新计数器:18,i=652
    (预计约1000,低于348)
  • 新计数器:142,i=96383
    (预计为100k,低于3617)
  • 新计数器:255,i=275361
    (预计为1M,低于724639!!!)
编辑:Hmmm。。。我在C中得到的结果与在JS中得到的结果相同。255个计数器的命中率约为300k


要么表格错误/过时,要么我执行的测试错误,要么代码正确,我误解了结果。

根据我的谷歌搜索,应该是这样的。在这个链接中:,它说“一个0到1之间的随机数R被提取出来。”。如果你想读的话,它会更详细。随机观察:在C代码中,
r
在[0,1]中,而在JS中,
r
在[0,1]中。你确定
LFU_INIT_VAL
对两者都是一样的吗?是的,应该是5。
/* Logarithmically increment a counter. The greater is the current counter value
 * the less likely is that it gets really implemented. Saturate it at 255. */
uint8_t LFULogIncr(uint8_t counter) {
    if (counter == 255) return 255;
    double r = (double)rand()/RAND_MAX;
    double baseval = counter - LFU_INIT_VAL;
    if (baseval < 0) baseval = 0;
    double p = 1.0/(baseval*server.lfu_log_factor+1);
    if (r < p) counter++;
    return counter;
}
LFU_INIT_VAL = 5
lfu_log_factor = 10

function LFULogIncr(counter) {
    if (counter == 255) return 255;
    let r = Math.random();
    let baseval = counter - LFU_INIT_VAL;
    if (baseval < 0) baseval = 0;
    let p = 1.0/(baseval*lfu_log_factor+1);
    if (r < p) counter++;
    return counter;
}
let hitFreq = 5
for (let i = 0; i < 1000000; i++) {
    let newHitFreq = LFULogIncr(hitFreq)
    if (newHitFreq > hitFreq) {
        console.log(`New counter: ${newHitFreq}, i = ${i}`)
    }
    hitFreq = newHitFreq
}
+--------+------------+------------+------------+------------+------------+
| factor | 100 hits   | 1000 hits  | 100K hits  | 1M hits    | 10M hits   |
+--------+------------+------------+------------+------------+------------+
| 0      | 104        | 255        | 255        | 255        | 255        |
+--------+------------+------------+------------+------------+------------+
| 1      | 18         | 49         | 255        | 255        | 255        |
+--------+------------+------------+------------+------------+------------+
| 10     | 10         | 18         | 142        | 255        | 255        |
+--------+------------+------------+------------+------------+------------+
| 100    | 8          | 11         | 49         | 143        | 255        |
+--------+------------+------------+------------+------------+------------+