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();
}
}
}