小编bud*_*rot的帖子

Erlang中准确的时钟

我在考虑如何实现一个过程,该过程给出了自启动以来发生的离散时间间隔的数量.我在这里失去了准确性吗?一段时间后以及在滥用客户端之后,我如何实现这一目标而不会失去准确性.我有点难过在Erlang中如何做到这一点.

当然我不想使用系统调用,如now().

-module(clock).
-compile([export_all]).

start(Time) ->
    register(clock, spawn(fun() -> tick(Time, 0) end)).

stop() -> clock ! stop.

tick(Time, Count) ->
    receive
        nticks ->
            io:format("~p ticks have passed since start~n", [Count])
    after 0 -> true
    end,
    receive
        stop ->
            void
    after Time ->
            tick(Time, Count + 1)
    end.
Run Code Online (Sandbox Code Playgroud)

erlang

7
推荐指数
1
解决办法
693
查看次数

为每个子集分割一个集合,该子集尊重其项目属性的概率

对于一个小游戏(我有点被迫使用C++,所以基于STL的解决方案在这里很有趣),我遇到了下面的问题.我想知道是否有关于这个主题的文献我可以阅读,或者是巧妙的实施.

唯一项目{E1,E2,E3}的集合S,每个项目E具有一组属性,{P1,P2,P3 ...}
该集合应该在S1,S2,S3,S4中分开.它定义了S1..4必须具有多大的精确度.我们可以假设集合可以正确地分成这些大小以解决问题的其余部分.

现在,对于S1,可以出现许多约束,{C1,C2 ..},它们指定例如,没有具有属性P1的项目可能出现在其中.另一个约束可能是它应该支持具有属性P2的因子为0.8的项(我们可以假设这些类型的约束针对每个属性的所有子集进行了规范化).

"加权"并不难实现.我只是用一些候选数字填充一些数组,权重较高的数组在这个数组中表示得更多.然后我选择数组的随机元素.数组的大小决定了准确性/粒度(在我的例子中,一个小数组就足够了).

问题是禁止出现一些项目.它很容易导致S中的一个项目需要放置在子集S1,S2,S3或S4中的一个中的情况,但是由于子集全部已满或者不满足,因此不再发生这种情况.完全具有此项无法出现在集中的特定约束.所以你必须回溯展示位置.过于频繁地这样做可能会过多地违反加权概率.

如何调用此问题,或者它是否容易映射到另一个(可能是NP)问题?

编辑:示例:

S = {A,B,C,D,E,F,G,H,I,J,K,L,M}

S1 = [0.8有VOWEL的概率,不能有I或K,SIZE = 6]
S2 = [0.2有VOWEL的概率,不能有M,B,E,SIZE = 7]

现在,假设我们开始填写FOR(LETTER IN S):

字母A,根据属性约束(0.8 vs 0.2)创建填充数组:
[ 1,1,1,1,1,1,1,2,2 ].
从该数组中选择一个随机元素:1.

现在,把A放在S1中.

例如,对于字母I,唯一的候选者将是2,因为S1具有我不能出现在其中的约束.

继续这样做,最终你可能会得到:
C = {M} //再分发一封信

S1 = A,B,D,E,F,G
S2 = C,F,G,I,K,L

现在,在哪里放置M?我不能被放置在S1中,因为那个已满,并且它不能放在S2中,因为它有一个约束,M不能放在其中.
唯一的方法是回溯一些位置,但是我们可能会过多地加重加权分布(fi,给S2一个S1的元音,它绕着自然分布翻转)

请注意,当更多子集在播放时,这会变得稍微复杂一些(在某种意义上需要更多的回溯),而不是仅仅2.

c++ algorithm

5
推荐指数
1
解决办法
231
查看次数

在 C 中使用 C++ API?

有一天,我决定开始用普通的旧 C 编写一个视频游戏。
这很有趣,三个月后(我有时离开工作的时间很少)我发现自己需要一些物理引擎。
我决定使用 Bullet 物理引擎,因为它似乎是我需要的更好的引擎之一。
然后,我发现 Bullet 并没有真正的 C API,而只有完整的 C++ API。它的 C API 没有得到维护。
经过一天的诅咒,我将我的项目“转换”为 C++,这是一个大胆的声明,表示我对所有堆分配进行了类型转换,并使用 new 和 delete 而不是 malloc 和 free,并在“extern“C”中包含了一些定义{ ... }'。
有些人可能会因为我这样做而向我开枪,但我看不出有其他选择可以使用性能任务处理的东西,例如这个物理引擎,它只有一个 C++ API,在 C 中。

所以现在,我正在使用 g++ 进行编译,同时仍然主要编写“C”代码。我发现自己不那么高兴了,因为代码感觉不再那么纯粹了。
C++ 给了我一些奇怪的错误消息,而我并不反对我经常不喜欢 g++ 解析器的语言。除了我现在可以愉快地将物体相互弹射这一事实之外,我的宠物项目的一些小而纯洁现在已经被遗弃了。

我想知道我是否做对了。我可以寻求一些建议吗,我应该继续而不用担心为我的“主要”C 代码使用 C++ 编译器吗?是否有其他方法可以在 C 中使用此 API 而不会影响性能或过度维护工作?

c c++ bullet bulletphysics

4
推荐指数
1
解决办法
2744
查看次数

程序集中的尾递归

我正在努力学习装配.我使用NASM而不是AT&T语法.

这是我的第一个程序,它比较两个命令行参数和输出哪个是最小的(如果它们相等则支持第一个).

我想我做错了.我注意到堆栈随着compare的每次"调用"而增长,所以我可以通过尾递归优化来改善它.但是,我不知道如何正确地做到这一点.我应该用其他东西替换所有出现的'call',比如jmp吗?我读到跳跃的方式也取决于你如何链接linux内核和/或libc关于'函数'对象(我没有链接libc,所以没有主'功能'),这让我困惑所以我以为我会来这里寻求简单的简短建议.

另外,我遇​​到的另一个问题是"jl"紧跟"jg"是多么愚蠢,如果"jl"跳转实际上改变了标志内容所以"jg"也会跳跃,这可能会导致不必要的行为.是否存在双向"原子"跳跃?

section .data
    usage:  db 'Please provide two strings',10
    usageLen:   equ $-usage
    bigger:     db 'It is bigger!',10
    biggerLen: equ $-bigger
    smaller:    db 'It is smaller!',10
    smallerLen: equ $-smaller

section .text
    global _start

_start:
    pop ebx ; argc
    cmp ebx, 3
    jne usage_exit

    pop eax ; argv[0]
    pop eax
    pop ebx
    call compare ;

usage_exit:
    mov eax, 4 ; sys_write
    mov ebx, 1 ; int fd = stdout
    mov ecx, usage 
    mov edx, usageLen 
    int 80h ; call …
Run Code Online (Sandbox Code Playgroud)

x86 assembly nasm

4
推荐指数
1
解决办法
1431
查看次数

处理WorldState的函数/ actor中的鸡或蛋

我读过"Purely Functional Retrogames"系列

http://prog21.dadgum.com/23.html

它讨论了一些有趣的技术来构建(半)纯游戏世界更新循环.

但是,我有以下方面的评论,我似乎无法理解:

假设你有一个系统,每个敌人,每个玩家都是独立的演员,或者是单独的纯粹功能.

假设他们都得到一个"WorldState"作为输入,并输出一个New WorldState(或者,如果你用演员术语思考,将新的WorldState发送给下一个actor,以例如"Game Render"演员结束).

然后,有两种方法可以解决这个问题:

  1. 要么你从一个演员开始,(对玩家来说),并向他提供"当前世界".然后,你将新世界,下一个敌人,等等,直到所有演员都改变了世界.然后,最后一个世界是你可以提供给渲染循环的新世界.(或者,如果您按照上面的文章,最终会得到世界上发生的可以处理的事件列表).

  2. 第二种方式,就是同时给所有演员当前的WorldState.它们产生任何可能发生冲突的变化(例如,两个敌人和玩家可以在相同的动画帧中获取硬币) - >由游戏系统通过处理事件来解决这些冲突.通过处理所有事件,Game actor创建新世界,用于下一个更新框架.

我有一种感觉,我只是面对完全相同的"竞争条件"问题,我希望通过使用具有不可变数据的纯函数来避免这个问题.

有什么建议吗?

erlang functional-programming game-engine

3
推荐指数
1
解决办法
114
查看次数

汇编代码中的引用/引用指针

我想看看by-reference与C++中的by-pointer的区别.
但是,g ++编译器(使用-O0 -S)生成相同的代码.
我试图"欺骗"编译器使用各种各样的设计构造产生某种差异,但它似乎比我更聪明.
有没有办法关闭gcc中的所有聪明,这样我才能理解汇编中引用的实现?

[编辑]

/* Testing assembly representation of ref/pointer/by-value parameters */

int byRef(int &value, int value2) {
    value = value2;
    return value;
}

int byPtr(int * value, int value2) {
    *value = value2;
    return *value;
}


int main(int argc, char * argv[]) {
    int value = 5;
    byRef(value, value);
    byPtr(&value, value);
}


call    ___main
movl    $5, -4(%ebp)
movl    -4(%ebp), %eax
movl    %eax, 4(%esp)
leal    -4(%ebp), %eax
movl    %eax, (%esp)
call    __Z5byRefRii
movl    -4(%ebp), %eax
movl    %eax, …
Run Code Online (Sandbox Code Playgroud)

c++ g++

1
推荐指数
1
解决办法
2835
查看次数