C#关于随机数抽取问题
1-33数中 随即抽取6个数的和是97用C#做桌面应用程序
每个数不能在一组里重复出现2次
如果再在一个TextBox里自己设置一个总和 然后在抽取
还有 是1-33中 不能有0
改如何实现
用C#做
还有 可不可以 一次性抽取多个6个数的数组
最好提供下源码 --------------------编程问答-------------------- 双色球?? --------------------编程问答-------------------- 模拟的
我光能抽取随机数 但是会重复 而且还有0 --------------------编程问答-------------------- 随机数Random rand = new Random(Guid.NewGuid().GetHashCode());
rand .Next(最小值,最大值)
Random rnd = new Random(DateTime.Now.Millisecond);
Enumerable.Range(1, 33).OrderBy(Guid.NewGuid()); --------------------编程问答-------------------- 没看懂什么意思阿。。 详细点 好吗 --------------------编程问答-------------------- private void btnExtraction_Click(object sender, EventArgs e)
{
if (input())//验证是否为空
{
string Num;
Num = txtNum.Text;
int sum = 0, total = int.Parse(Num);
int numbert = 6;
int i = 1;
int temp = 0;
int startnumber = 1, endnumber = 33;
int[] number = new int[34];
int[] random = new int[6];
for (i = 1; i <= endnumber; i++)
{
number[i] = i;
}
Random R = new Random();
temp = R.Next(startnumber, endnumber);
i = 1;
random[0] = temp;
do
{
for (i = 1; i < numbert; i++)
{
random[i] = 0;
temp = R.Next(startnumber, endnumber);
for (int j = 1; j <= i; j++)
{
if (temp != random[j])
{
random[i] = temp;
}
else
{
temp = R.Next(startnumber, endnumber);
}
}
}
sum = 0;
for (i = 0; i < numbert; i++)
{
sum += random[i];
}
} while (sum != total);
string test = "";
for (i = 0; i < numbert; i++)
{
test += random[i].ToString() + " ";
}
txtNum1.Text = random[0].ToString();
txtNum2.Text = random[1].ToString();
txtNum3.Text = random[2].ToString();
txtNum4.Text = random[3].ToString();
txtNum5.Text = random[4].ToString();
txtNum6.Text = random[5].ToString();
}
还是有重复的数 该怎么修改 --------------------编程问答-------------------- 怎么都没有人呢。。
我把重复也解决了
可不可以抽取多组数
private void btnExtraction_Click(object sender, EventArgs e)
{
if (input())//验证是否为空
{
string Num;
Num = txtNum.Text;
int sum = 0, total = int.Parse(Num);
int numbert = 6;
int i = 1;
int temp = 0;
int startnumber = 1, endnumber = 33;
int[] number = new int[34];
int[] random = new int[6];
for (i = 1; i <= endnumber; i++)
{
number[i] = i;
}
Random R = new Random();
temp = R.Next(startnumber, endnumber);
i = 1;
random[0] = temp;
do
{
for (i = 1; i < numbert; i++)
{
random[i] = 0;
int j = 0;
bool flag = false;
temp = R.Next(startnumber, endnumber);
do
{
for (j = 0; j < i; j++)
{
if (temp != random[j])
{
flag = true;
}
else
{
j = -1;
temp = R.Next(startnumber, endnumber);
flag = false;
}
}
} while (flag == false);
random[i] = temp;
}
sum = 0;
for (i = 0; i < numbert; i++)
{
sum += random[i];
}
} while (sum != total);
string test = "";
for (i = 0; i < numbert; i++)
{
test += random[i].ToString() + " ";
}
txt.Text = test;
txtNum1.Text = random[0].ToString();
txtNum2.Text = random[1].ToString();
txtNum3.Text = random[2].ToString();
txtNum4.Text = random[3].ToString();
txtNum5.Text = random[4].ToString();
txtNum6.Text = random[5].ToString();
} --------------------编程问答-------------------- 思路有很多:
1.定义一个list变量,一次取出来一个随机数,然后判断list中是否有该数,如果没有则添加进去,如果有,则继续循环下一次。知道list的Count到了6为止。
2.反过来讲,先定义一个list装满1到33,然后每次随机再里面拿出来一个(注意拿的同时,要删除它),拿6次,也不会得到重复的数字。
思路1的代码很简单,自己应该想就可以了,本人认为思路2的代码比较符合彩票类的原理性质,所以给你思路2的代码:
--------------------编程问答-------------------- 楼上的,他还要判断和为97呢
public int[] GetBalls(){
list<int> balls = new list<int>();
list<int> retult = new list<int>();
for(int i=1;i<=33;i++)
{
// 赋值 ,1-33;
balls.add(i);
}
Random rand= new Random();
int index = 0;
for(int j=1;j++;j<6){
//随机取出索引
index = rand.Next(0,list.Count-1);
//从balls中拿出"球"
retult.add(balls[index]);
//用RemoveAt比Remove要效率的多,因为是通过索引删除。
balls.RemoveAt(index);
}
return result.toArray();
}
using System;
using System.Collections.Generic;
using System.Text;
namespace RandomNumbers
{
class RandomNumbers
{
const int MINNUM = 1;
const int MAXNUM = 33;
const int COUNT = 6;
const int TOTAL = 97;
Random random = new Random();
/// <summary>
/// 随机函数
/// </summary>
public int[] DoRandom()
{
//初始化
int avg = (TOTAL / COUNT);
int[] result = new int[COUNT+1];
result[0] = 0;
result[COUNT] = TOTAL;
for (int i = 1; i < COUNT; ++i)
{
result[i] = avg * i;
}
//随机移动100次
for(int i=0;i<100;++i)
{
int index = random.Next(1, COUNT);
int l=result[index+1]-result[index-1];
int left = 0;
int right = 0;
if (MAXNUM >= l)
{
left = result[index - 1] + 1;
right = result[index + 1] - 1;
}
else
{
left = result[index - 1] + (l - MAXNUM) + 1;
right = result[index + 1] - (l - MAXNUM) - 1;
}
result[index] = random.Next(left, right+1);
}
//获得结果
int[] _result = new int[COUNT];
for (int i = 1; i <= COUNT; ++i)
{
_result[i - 1] = result[i] - result[i - 1];
}
//判断是否有重复数字
if (IsRepeat(_result)) return DoRandom();
return _result;
}
/// <summary>
/// 判断是否有重复
/// </summary>
private bool IsRepeat(int[] result)
{
List<int> list = new List<int>();
for (int i = 0; i < result.Length; ++i)
{
if (list.Contains(result[i]))
return true;
list.Add(result[i]);
}
return false;
}
/// <summary>
/// 显示
/// </summary>
public void Display()
{
int[] result = DoRandom();
int count = 0;
for (int i = 0; i < result.Length; ++i)
{
count += result[i];
Console.Write(result[i] + " ");
}
Console.WriteLine("\ntotal:" + count + "\n");
}
/// <summary>
/// 主函数
/// </summary>
static void Main()
{
RandomNumbers r = new RandomNumbers();
for (int i = 0; i < 100; ++i)
r.Display();
}
}
}
补充:.NET技术 , C#