编辑代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;

namespace RandomNumberGenerator
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        private void btnGenerate_Click(object sender, EventArgs e)
        {
            // 清除之前的结果
            txtResults.Clear();
            lstResults.Items.Clear();

            // 验证输入
            if (!ValidateInputs()) return;

            // 获取输入值
            int count = (int)numCount.Value;
            double min = (double)numMin.Value;
            double max = (double)numMax.Value;
            bool isInteger = radInteger.Checked;
            int decimalPlaces = (int)numDecimalPlaces.Value;
            bool allowDuplicates = chkAllowDuplicates.Checked;

            // 生成随机数
            List<string> results;
            if (isInteger)
            {
                results = GenerateIntegerRandomNumbers(count, (int)min, (int)max, allowDuplicates);
            }
            else
            {
                results = GenerateDoubleRandomNumbers(count, min, max, decimalPlaces, allowDuplicates);
            }

            // 显示结果
            DisplayResults(results);
        }

        private bool ValidateInputs()
        {
            // 验证范围
            if (numMin.Value >= numMax.Value)
            {
                MessageBox.Show("结束值必须大于起始值", "输入错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            // 验证小数位数
            if (radDecimal.Checked && numDecimalPlaces.Value < 1)
            {
                MessageBox.Show("小数位数必须大于0", "输入错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            // 验证重复设置
            if (!chkAllowDuplicates.Checked)
            {
                double range = (double)(numMax.Value - numMin.Value);
                int possibleValues = radInteger.Checked 
                    ? (int)(numMax.Value - numMin.Value) + 1 
                    : (int)Math.Pow(10, (int)numDecimalPlaces.Value) * (int)range + 1;

                if (numCount.Value > possibleValues)
                {
                    MessageBox.Show($"不允许重复时,生成数量不能超过可能值数量({possibleValues})", 
                                  "输入错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }
            }

            return true;
        }

        private List<string> GenerateIntegerRandomNumbers(int count, int min, int max, bool allowDuplicates)
        {
            List<string> results = new List<string>();
            Random random = new Random();
            HashSet<int> generated = new HashSet<int>();

            while (results.Count < count)
            {
                int number = random.Next(min, max + 1);
                
                if (!allowDuplicates)
                {
                    if (generated.Contains(number)) continue;
                    generated.Add(number);
                }
                
                results.Add(number.ToString());
            }

            return results;
        }

        private List<string> GenerateDoubleRandomNumbers(int count, double min, double max, int decimalPlaces, bool allowDuplicates)
        {
            List<string> results = new List<string>();
            Random random = new Random();
            HashSet<string> generated = new HashSet<string>();

            while (results.Count < count)
            {
                double range = max - min;
                double sample = random.NextDouble();
                double number = min + (sample * range);
                string formattedNumber = number.ToString("F" + decimalPlaces);
                
                if (!allowDuplicates)
                {
                    if (generated.Contains(formattedNumber)) continue;
                    generated.Add(formattedNumber);
                }
                
                results.Add(formattedNumber);
            }

            return results;
        }

        private void DisplayResults(List<string> results)
        {
            foreach (string number in results)
            {
                lstResults.Items.Add(number);
            }

            txtResults.Text = string.Join(Environment.NewLine, results);
        }

        private void radInteger_CheckedChanged(object sender, EventArgs e)
        {
            numDecimalPlaces.Enabled = radDecimal.Checked;
        }

        private void btnCopy_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrWhiteSpace(txtResults.Text))
            {
                Clipboard.SetText(txtResults.Text);
                MessageBox.Show("结果已复制到剪贴板", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void btnClear_Click(object sender, EventArgs e)
        {
            txtResults.Clear();
            lstResults.Items.Clear();
        }
    }
}