随机呈现的面板平均超过 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; } 

它并不是世界上最漂亮的东西。但它可以完成工作。

随机呈现的面板平均超过 20 次出现

使用大多数正常库例程的随机数是伪随机性的低质量来源。如果这是针对随机科学研究,这将是您的协议设计中的一个缺陷。

我建议的方法是将其视为一种随机安排至少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是一个很好的起点。