我正在尝试使用单线程时间驱动模拟来模拟Aloha。任何时候任何节点都可以生成一个帧。我有五个节点(A到E)和一个每1秒钟滴答一次的计时器。我希望在任何时候,例如节点创建一个帧后经过15秒,然后一段时间后另一个节点创建一个帧(以不规则的间隔)。
E.g. (Output)
Time
1 Node A created a frame.
2
3 Node B created a frame.
4
5
6
7
8 Node E created a frame.
9
10
在我现在的代码中,任何帧都是由节点每秒创建的。节点是随机选择的。
E.g. (Current output)
1 Node E created a frame.
2 Node B created a frame.
3 Node E created a frame.
4 Node A created a frame.
5 Node E created a frame.
a。)我不希望节点每秒生成一个帧,但在模拟过程中会以不规则的间隔生成帧。
b。)然后我必须创建一个不允许节点的方法,例如A生成另一帧直到一段时间让我们说10秒过去了。如果在那10秒期间没有其他节点创建了帧,则在计数器处成功发送帧递增。如果在那10秒内另一个节点创建了一个帧,则两个帧(例如,由A创建的帧和由该节点创建的帧不成功)。
private static void timer_Elapsed(object sender, ElapsedEventArgs e)
{
time++;
Random r = new Random();
//int rnd = r.Next(0, 50);
if (time > 50)
{
Console.WriteLine("Simulation Finished.");
timer.Stop();
}
else
{
Console.WriteLine(time + " " + Node());
}
}
//Randomly select a node
private static string Node(){
string[] nodeList = { "A", "B", "C", "D", "E" };
Random r = new Random();
int index = r.Next(0, nodeList.Length);
return Convert.ToString(nodeList[index]);
}
感谢您的帮助,我们将非常感谢您提供的代码段。
答案 0 :(得分:1)
我可能会遗漏一些东西,但是你无法在timer_Elapsed事件中重置计时器的间隔?
timer.Interval = random.Next(1,15)* 1000;
使用System.Timers;
public class Simulation {
private Timer intervalTimer;
private Timer actionTimer;
private Random random = new Random();
private bool writeState = false;
private int currentTick = 0;
public Simulation(){
intervalTimer = new Timer(SetRandomInterval());
actionTimer = new Timer(1000);
intervalTimer.Elapsed += new ElapsedEventHandler(IntervalTimerElapsed);
actionTimer.Elapsed += new ElapsedEventHandler(ActionTimerElapsed);
intervalTimer.Start();
actionTimer.Start();
}
protected void IntervalTimerElapsed(object sender, EventArgs e) {
if (writeState){
writeState = false;
} else {
writeState = true;
}
intervalTimer.Interval = SetRandomInterval();
}
protected void ActionTimerElapsed(object sender, EventArgs e) {
if (writeState){
Console.WriteLine(currentTick.ToString() + " " + Node());
writeState = false;
} else {
Console.WriteLine(currentTick.ToString());
}
currentTick++;
}
private string Node(){
string[] nodes = { "A", "B", "C", "D", "E" };
int index = random.Next(0, nodes.Length);
return Convert.ToString(nodes[index]);
}
private int SetRandomInterval(){
return (random.Next(1, 15) * 1000);
}
}
打印出来:
0 D
1
2 A
3
4
5
6 D
7
8
9 B
10 E
11
12 B
13
14
15 B
16
17
18 C
19
20
21
22 A
23
24
25 B
26 C
27 C
28 E
29 B
30
31
32
33 D
你也可以使用一个单一的Random()实例,否则你可以在这样一个" rapid"中连续获得相同的值。像Elapsed这样的事件。 使用新的Random in Elapsed可能会有点贵。