从100里取5个随机数,要求5次都是随机的,而其这5个随机数相加起来的总和是100!请问,有解决的算法吗?
解决方案 »
- c#C/S模式中的多线程问题(小弟新手。。。)
- c# 部署问题_高手救命
- 请问,有不同的EXCEL表,各种WORD文档,我想作一个它们的列表,通过点击这个列表的某个名称,显示对应的文档。如何作?
- 对一张图片的某点(例如点(10,10))的色值,为了精确,我将图片放大16倍后再取值,此时该点是不是对应点(160,160)
- 有关打印的问题
- C#有关TreeView动态生成根节点、子节点的问题
- 求IE直接打开WORD文件的方法(不要弹出<打开>、<保存>、<取消>对话框)
- 如何在C#下實現摇奖程序
- 关于RDLC子报表的问题
- 请问如何实现软件试用30天的功能?(答者有分)
- 大家闲聊:VC6和C#区别多大
- C#中的WebBrowser,怎么设置网页的大小!
{
int[] intArray = new int[100];
for (int count = 0; count < intArray.Length; count++)
{
intArray[count] = count;
}
bool boolean = true;
Random rd = new Random();
int[] tempArray = new int[5];
while (boolean)
{
int result_value = 0;
for (int count = 0; count < 5; count++)
{
int tempint = intArray[rd.Next(1, 100)];
result_value = result_value + tempint;
tempArray[count] = tempint;
}
if (result_value == 100)
{
boolean = false;
}
}
for (int count = 0; count < tempArray.Length; count++)
{
MessageBox.Show("数列分别为" + tempArray[count].ToString());
}
}
int temp = 100;
int[] arr = new int[5];
int index = 0;
while (temp > 0)
{
Random r = new Random(Environment.TickCount);
int i = r.Next(1, temp + 1);
temp -= i;
if (temp > 0)
{
if (index < 4)
{
arr[index] = i;
index++;
continue;
}
else if (index == 4)
{
temp = 100;
index = 0;
continue;
}
}
else if (temp == 0)
{
if (index < 4)
{
temp = 100;
index = 0;
continue;
}
else if (index == 4)
{
arr[index] = i;
break;
}
}
}
StringBuilder sb = new StringBuilder();
foreach (int i in arr)
sb.AppendFormat("{0}+", i);
Console.WriteLine("{0}=100", sb.ToString().TrimEnd('+'));
{
int[] intArray = new int[100];
for (int count = 0; count < intArray.Length; count++)
{//初始化你的数组值
intArray[count] = count;
}
bool boolean = true;//控制循环变量
Random rd = new Random();//随机取数变量
int[] tempArray = new int[5];//临时存放变量至数组
while (boolean)
{
int result_value = 0;//临时相加结果存放
for (int count = 0; count < 5; count++)
{
int tempint = intArray[rd.Next(1, 100)];//从100个数里随机取一个(有可能重复)
result_value = result_value + tempint;//每次取数相加
tempArray[count] = tempint;
}
if (result_value == 100)
{
boolean = false;
}
}
for (int count = 0; count < tempArray.Length; count++)//显示
{
MessageBox.Show("数列分别为" + tempArray[count].ToString());
}
}
{
bool boolean = true;//控制循环变量
Random rd = new Random();//随机取数变量
int[] tempArray = new int[5];//临时存放变量至数组
while (boolean)
{
int result_value = 0;//临时相加结果存放
for (int count = 0; count < 5; count++)
{
int tempint = rd.Next(1, 100);//从100个数里随机取一个(有可能重复)
result_value = result_value + tempint;//每次取数相加
tempArray[count] = tempint;
}
if (result_value == 100)
{
boolean = false;
}
}
for (int count = 0; count < tempArray.Length; count++)//显示
{
MessageBox.Show("数列分别为" + tempArray[count].ToString());
}
}
1, 第一次 生成随机数n1=random(100)
2. 第二次 生成随机数random(100-n1)
3. 第三次 生成随机数random(100-n1-n2)
...
直到取出5个数
int[] aa=new int[5];
Random random=new Random();
for(i=0;i<5;i++)
{
if(i==0)
aa[i]=random.next(0,100);
else
aa[i]=random.next(0,(100-a[i-1]));
}
2:如果5个数不可以重复(这方法效率不太好感觉,等高手)
int[] aa=new int[5];
Random random=new Random();
//得到5个不同随机数
prvate void Random_F()
{
for (int i = 0; i < 5; i++)
{
int temp;
if (i == 0)
aa[i] = random.Next(0, 100);
else
{
temp = random.Next(0, 100);
for (int j = 0; j < i; j++)
{
if (aa[j] == temp)
{
temp = random.Next(0, 100);
aa[i] = temp;
j = -1;
}
else
{
aa[i] = temp;
}
}
}
}
}
//判断5个数的和是否是100,如果不是重新获取5个不同随机数
for(int k=0;k<5;k++)
{
int sum=0;
sum+=aa[k];
if(sum!=100)
Random_F();
}
{
Random tempdata = new Random();
int[] temp = new int[5] ;
bbs:for (int i = 0; i < 5; i++)
{
temp[i] = tempdata.Next(1, 100);
}
int tempsum = temp[1] + temp[2] + temp[3] + temp[4] + temp[0];
if (tempsum == 100)
{
MessageBox.Show(temp[1].ToString() + "," + temp[2].ToString() + "," + temp[3].ToString() + "," + temp[4].ToString() + "," + temp[0].ToString());
}
else
{
goto bbs;
} }
假如你取一个随机数是60,那么你第二个随机数是在0-40中取,如果是20,第3个随机数在0-20中取。
极端的情况是第一数就是100,那么以后的数都在random.next(0,0)中取
这个算法的问题就是不断缩小Random.Next()
的范围,这样就不算是每次从100里面抽取吧
还有就是可能会出现重复1的情况~
所以, int[] data = new int[5];
Random r = new Random();
int MaxValue = 100;
for (int nI = 0; nI < 5; nI++)
{
if (nI + 1 == 5)
{
data[nI] = MaxValue;
}
else
{
data[nI] = r.Next(0, MaxValue);
MaxValue = MaxValue - data[nI];
}
}
第一次取1到90之间的随机数。第一次得到数a
第二次取1 到 100-a-6 之间的随机数,得到数b,若a==b,重复第二部。
第三次取1到 100-a-b-3之间的随机数,得到数c,若a==c or b==c 重复第三步。
第四次取1到 100-a-b-c-1之间的随机数,得到数d,若a===d or b==d or c==d重复第四步。
第五次不用取了100-a-b-c-d为数e.若e==a or e==b or e==c or e===d 返回第二步,否则得到满足条件随机数a,b,c,c,e
Random r = new Random();
var NumberList = new List<int>();
for (int i = 1; i <=100; i++)
{
NumberList.Add(i);
}
var randomList = new List<int>();
for (int i = 0; i < 4; i++)
{
var index = r.Next(NumberList.Count-1);
randomList.Add(NumberList[index]);
}
第五个数可以算出来,只说取不同随机数的一个方法,中间涉及到不合理数判断没做,
例如:第一个随机数如果大于90,肯定不能取到 5个不同的和为100的数,
原因简单:100以内最小4个随机数为1,2,3,4--->第五个数为90,如大于90,就凑不到另外几个数了
Random r = new Random();
var NumberList = new List<int>();
for (int i = 1; i <=100; i++)
{
NumberList.Add(i);
}
var randomList = new List<int>();
for (int i = 0; i < 4; i++)
{
var index = r.Next(NumberList.Count-1);
randomList.Add(NumberList[index]);
NumberList.RemoveAt(index);
}上面的代码少了一个NumberList.RemoveAt(index);
private static int[] GetRandom(out int sum, int size)
{ Random random = new Random();
int temp = 0;
int[] intList = new int[size];
bool flag = true; do
{
sum = 0;
for (int i = 0; i < 5; i++)
{
temp = random.Next(1, 100 - temp);
intList[i] = temp;
sum += temp;
}
if (sum == 100)
flag = false; } while (flag); return intList;
}