Я решил эту проблему, создав класс Process с атрибутом типа и голосования и методом getVote()
,
- Тип: надежный, ненадежный
- Голосование: голосование (
v0
в начале будет сходиться к v
по протоколу) setVote()
: установить голосование. getVote()
: если тип является надежным, вернуть бит иначе возвращает случайное число от 0
до 1
.
Для имитации распределенного алгоритма go вы можете запустить протокол в отдельных потоках, каждый из которых содержит класс процесса, и взаимодействовать с общий общий массив, который вы можете обновлять каждый раунд.
Пример здесь
Вы также можете моделировать все, начиная с массива этих объектов, без необходимости использования отдельных потоков ,
Полагаю, этого должно хватить для управления моделью.
примерно так:
export class Process {
constructor(public pid: number, public vote: number, public type: ProcessType ) { }
set(bit: number) {
this.vote = this.send(bit);
}
send(b) {
if (this.type === ProcessType.unreliable) {
return Math.round(Math.random());
}
return b;
}
get() {
return { pid: this.pid, vote: this.vote, type: this.type};
}
getVote() {
return this.send(this.vote);
}
}
Удачи!