随机呈现的面板平均超过 20 次出现
本文关键字:随机 | 更新日期: 2023-09-27 18:34:12
所以这是基本代码:
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
protected Random random;
public Form1()
{
InitializeComponent();
random = new Random();
}
private void Form1_Load(object sender, EventArgs e)
{ }
private void button1_Click(object sender, EventArgs e)
{
bool button1Clicked = true;
if (button1Clicked == true) { ITIpanel.Visible = true; }
}
private void ITIpanel_Paint(object sender, PaintEventArgs e)
{
ITItimer.Enabled = true;
}
private void ITItimer_Tick(object sender, EventArgs e)
{
double rand = random.NextDouble();
if (rand < .50d) { bluestimPanel.Visible = true; }
else if (rand > .5d) { redstimPanel.Visible = true; }
ITItimer.Enabled = false;
}
private void bluestimPanel_Paint(object sender, PaintEventArgs e)
{
Trialtimer.Enabled = true;
}
private void redstimPanel_Paint(object sender, PaintEventArgs e)
{
Trialtimer.Enabled = true;
}
private void Trialtimer_Tick(object sender, EventArgs e)
{
bluestimPanel.Visible = false;
redstimPanel.Visible = false;
Trialtimer.Enabled = false;
ITIpanel.Visible = true;
}
}
}
如您所见,程序本身相当简单。在 ITItimer 的滴答声中,红色或蓝色面板随机出现。我想修改一下,如果 ITItimer 总共滴答 10 次,红色和蓝色面板将分别出现 5 次。
我已经研究了一周左右,但还没有找到解决方案。关于我如何最好地实现这一目标的任何想法?
我实际上得到了以下工作:
double rand = random.NextDouble();
if (rand < .50d && blue < 5) { bluestimPanel.Visible = true; }
else if (blue == 5) { redstimPanel.Visible = true; }
if (rand > .5d && red < 5) { redstimPanel.Visible = true; }
else if (red == 5) { bluestimPanel.Visible = true; }
if (red >= 5 && blue >= 5) { panel1.Visible = true; }
它并不是世界上最漂亮的东西。但它可以完成工作。
使用大多数正常库例程的随机数是伪随机性的低质量来源。如果这是针对随机科学研究,这将是您的协议设计中的一个缺陷。
我建议的方法是将其视为一种随机安排至少N个试验会话的方法,其中有X个试验类型。
下面是用于说明该概念的伪代码。
Let MinimumTrials be N MOD X + X
Let SessionList be a List<Trial>
For Each TrialType
add X instances of that trial type to SessionList
Shuffle(SessionList)
然后,您的会话引擎可以在遍历会话列表时调用各个试用版,以均匀分布可能的试用订单。请注意,Shuffle是一个需要一定程度的技巧才能正确的操作,搜索SO是一个很好的起点。