ノードをサイクリックに割り付けると, 規則性のあるプログラムでは 特定のノードに負荷が集中してしまう場合がある. それを回避する一つの 割り付け手法がランダム割り付けである. 割り付けるノードの番号を 乱数によって決める手法である. 次に示したプログラムは spawn プロセスを 100 個擬似乱数を使ってノードに割り付けた例である.
:- module foo.
distribute(N):- true | %(1)
current_node(_,PEs), %(2)
random(Rs,23,PEs), %(3)
fork(N,Rs). %(4)
fork(0,Rs):- true | Rs=[]. %(5)
otherwise.
fork(N,Rs):- true | %(6)
Rs=[get(PeNo)|NewRs], %(7)
spawn@node(PeNo), %(8)
N1:=N-1, %(9)
fork(N1,NewRs). %(10)
random([get(Rnd)|RS],Seed,R):- true | %(11)
Rnd:= Seed mod R, %(12)
NewSeed:=(125*Seed+1) mod 4096, %(13)
random(RS,NewSeed,R). %(14)
random([],_,_):- true | true. %(15)
(16)のようにゴールを呼び出すと, 100 ノードの環境であれば,
(7)の部分で乱数生成プロセスから0から99までの一様乱数を得,
(8)の部分でノードの割り付けを行なう.
この例の場合では, ノードは 23, 76, 49, 10, 99, 32,
と
割り付けられる.