c# 随机顺序生成1到54的54个数字,存入数组!不能重复!
如题!总c系的语言写出来都行,反正基本通用!最好原生态c#小弟初学,逻辑能力欠缺,望各位帮忙我自己写了个很好理解的方法,基本没什么需要逻辑能力的地方,算是折中的方法吧!/...
如题!总c系的语言写出来都行,反正基本通用!最好原生态c# 小弟初学,逻辑能力欠缺,望各位帮忙
我自己写了个很好理解的方法,基本没什么需要逻辑能力的地方,算是折中的方法吧!
////////////////////////////随机排列54个数字////////////////////////////////
for (int j = 1; j <= 54; j++)
numcou[j - 1] = j;
int tempnum = 0;
for (int k = 0; k < 54;k++ )
{
int dif1 = num.Next(0, 54);
int dif2 = num.Next(0, 54);
tempnum = numcou[dif1];
numcou[dif1] = numcou[dif2];
numcou[dif2] = tempnum;
}
////////////////////////////////////////////////////////////////////////////////////////// 展开
我自己写了个很好理解的方法,基本没什么需要逻辑能力的地方,算是折中的方法吧!
////////////////////////////随机排列54个数字////////////////////////////////
for (int j = 1; j <= 54; j++)
numcou[j - 1] = j;
int tempnum = 0;
for (int k = 0; k < 54;k++ )
{
int dif1 = num.Next(0, 54);
int dif2 = num.Next(0, 54);
tempnum = numcou[dif1];
numcou[dif1] = numcou[dif2];
numcou[dif2] = tempnum;
}
////////////////////////////////////////////////////////////////////////////////////////// 展开
5个回答
展开全部
C# 控制台实现
using System;
using System.Collections.Generic;
namespace _4dddd
{
class Program
{
static void Main(string[] args)
{
int[] numRes = RandomOnly(1, 55);//调用生成方法,1和55可以让用户输入哦
Console.WriteLine("获得的随机且不重复的长度为{0}的数组为:",(55-1));
for (int i = 0; i < numRes.Length; i++)
{
Console.Write(numRes[i] + ",");
}
Console.ReadKey();
}
/// <summary>
/// 生成 (ranMax-ranMin) 个长度的数组,值从 ranMin 到 ranMax 之间取,且不重复
/// </summary>
/// 方法的思想:一。先创建2个数组,数组a的值按下标从小到大对应的值也依次增大,数组b先不赋值
/// 二。再用Random随机生成ranMin到ranMax之间的数,让这个数作为数组a的下标
/// 把数组a的这个下标中的值赋给数组b,然后当前数组a中的值和数组a中最后的值交换,
/// 再生成随机下标的时候ranMax--,循环此步骤知道ranMax--=ranMin
///
/// 例如:比如要生成[1-5]无重复数组b,先建一个长度为4的数组a{1,2,3,4} 注意5不能取到
/// 第一次通过随机方法生成假如为2,那么我们把数组a中下标为2的值存数组b的第一个位置,
/// 同时处理数组a,使其变为{1,4,3,2},并且ranMax-1
/// 第二次循环的时候随机方法只能从1-4之间随机生成,假如为1,那么把数组a下标为1的值存数组b的第二个位置,
/// 同时处理数组a,使其变为{1,4,3,2},并且ranMax-1
/// 第三次只能从1-3之间随机生成数字......循环知道填充完毕即可,数组b就是结果
///
/// <param name="ranMin">随机的最小数,可以取到</param>
/// <param name="ranMax">随机的最大数,不能取到</param>
/// <returns></returns>
static int[] RandomOnly(int ranMin, int ranMax)
{
//获得要生成数组的长度
int length = ranMax - ranMin;
//创建2个数组,并给numA按依次递增赋值
int[] numA = new int[length];
int[] numB = new int[length];
for (int i = 0; i < length; i++)
{
numA[i] = i + ranMin;//注意对应关系,下标从零开始
}
//生成随机生成器
Random rand = new Random();
int n, tmp;//2个临时存储变量
///这个算法只需要循环你的数范围的次数而已
for (int i = 0; i < length; i++)
{
//随机产生一个 ranMin - ranMax 之间的数,ranMax不可取到
n = rand.Next(ranMin, ranMax);
//把产生的随机数转换处理当成numA的下标赋给numB数组
numB[i] = numA[n - ranMin];
//然后把 numA[n] 和它最后一个数交换 numA[ranMax] ,这是避免重复
tmp = numA[n - ranMin];
numA[n - ranMin] = numA[ranMax - ranMin - 1];
//numA[ranMax- ranMin] = tmp;//写不写没关系了
ranMax--;//自减,循环
}
//numB数组就是最终结果喽
return numB;
}
}
}
粘的时候 这个文本编辑器有问题,对不齐,可以到我空间看整齐的版本。 http://hi.baidu.com/donny945/blog/item/38c45110e59de362ca80c487.html?timeStamp=1318791196294
using System;
using System.Collections.Generic;
namespace _4dddd
{
class Program
{
static void Main(string[] args)
{
int[] numRes = RandomOnly(1, 55);//调用生成方法,1和55可以让用户输入哦
Console.WriteLine("获得的随机且不重复的长度为{0}的数组为:",(55-1));
for (int i = 0; i < numRes.Length; i++)
{
Console.Write(numRes[i] + ",");
}
Console.ReadKey();
}
/// <summary>
/// 生成 (ranMax-ranMin) 个长度的数组,值从 ranMin 到 ranMax 之间取,且不重复
/// </summary>
/// 方法的思想:一。先创建2个数组,数组a的值按下标从小到大对应的值也依次增大,数组b先不赋值
/// 二。再用Random随机生成ranMin到ranMax之间的数,让这个数作为数组a的下标
/// 把数组a的这个下标中的值赋给数组b,然后当前数组a中的值和数组a中最后的值交换,
/// 再生成随机下标的时候ranMax--,循环此步骤知道ranMax--=ranMin
///
/// 例如:比如要生成[1-5]无重复数组b,先建一个长度为4的数组a{1,2,3,4} 注意5不能取到
/// 第一次通过随机方法生成假如为2,那么我们把数组a中下标为2的值存数组b的第一个位置,
/// 同时处理数组a,使其变为{1,4,3,2},并且ranMax-1
/// 第二次循环的时候随机方法只能从1-4之间随机生成,假如为1,那么把数组a下标为1的值存数组b的第二个位置,
/// 同时处理数组a,使其变为{1,4,3,2},并且ranMax-1
/// 第三次只能从1-3之间随机生成数字......循环知道填充完毕即可,数组b就是结果
///
/// <param name="ranMin">随机的最小数,可以取到</param>
/// <param name="ranMax">随机的最大数,不能取到</param>
/// <returns></returns>
static int[] RandomOnly(int ranMin, int ranMax)
{
//获得要生成数组的长度
int length = ranMax - ranMin;
//创建2个数组,并给numA按依次递增赋值
int[] numA = new int[length];
int[] numB = new int[length];
for (int i = 0; i < length; i++)
{
numA[i] = i + ranMin;//注意对应关系,下标从零开始
}
//生成随机生成器
Random rand = new Random();
int n, tmp;//2个临时存储变量
///这个算法只需要循环你的数范围的次数而已
for (int i = 0; i < length; i++)
{
//随机产生一个 ranMin - ranMax 之间的数,ranMax不可取到
n = rand.Next(ranMin, ranMax);
//把产生的随机数转换处理当成numA的下标赋给numB数组
numB[i] = numA[n - ranMin];
//然后把 numA[n] 和它最后一个数交换 numA[ranMax] ,这是避免重复
tmp = numA[n - ranMin];
numA[n - ranMin] = numA[ranMax - ranMin - 1];
//numA[ranMax- ranMin] = tmp;//写不写没关系了
ranMax--;//自减,循环
}
//numB数组就是最终结果喽
return numB;
}
}
}
粘的时候 这个文本编辑器有问题,对不齐,可以到我空间看整齐的版本。 http://hi.baidu.com/donny945/blog/item/38c45110e59de362ca80c487.html?timeStamp=1318791196294
展开全部
//先声明一个数组,并将1~54按顺序插入到数组中。
int[] indexs = new int[54];
for (int i = 0; i < 54; i++)
{
indexs[i] = i + 1;
}
//声明一个新数组,这个数组为结果数组
int[] result = new int[54];
Random r = new Random();
int site = 54;//最大的索引位置
int rindex = 0;
for (int j = 0; j < 54; j++)
{
//从0~最大的索引位置中取索引
rindex = r.Next(0, site);
//将随机索引的值插入到新的数组
result[j] = indexs[rindex];
//将原数组的rindex位置的值替换成原数组中最后一个值
indexs[rindex] = indexs[site - 1];
site--;
}
//输出结果
for (int i = 0; i < 54; i++)
{
Console.WriteLine(result[i]);
}
int[] indexs = new int[54];
for (int i = 0; i < 54; i++)
{
indexs[i] = i + 1;
}
//声明一个新数组,这个数组为结果数组
int[] result = new int[54];
Random r = new Random();
int site = 54;//最大的索引位置
int rindex = 0;
for (int j = 0; j < 54; j++)
{
//从0~最大的索引位置中取索引
rindex = r.Next(0, site);
//将随机索引的值插入到新的数组
result[j] = indexs[rindex];
//将原数组的rindex位置的值替换成原数组中最后一个值
indexs[rindex] = indexs[site - 1];
site--;
}
//输出结果
for (int i = 0; i < 54; i++)
{
Console.WriteLine(result[i]);
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
取数时用random()函数,然后判断新输出的数据和前面有没有重复,大概就是这个思路
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
C#常见的笔试题其中就有一道是这样的,给你个网上的标准答案(效率比较低)和我自己改进后的算法
标准答案:
private void btnOK1_Click(object sender, EventArgs e)
{
int length = 0;
string strLength = Microsoft.VisualBasic.Interaction.InputBox("请输入数组长度", "输入框", "100", 400, 300);
Int32.TryParse(strLength, out length);
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
if (length != 0)
{
int[] intArr = new int[length];
ArrayList arraylist = new ArrayList();
Random ran = new Random();
while (arraylist.Count < length)
{
int num = ran.Next(1, length + 1);
if (!arraylist.Contains(num))
{
arraylist.Add(num);
}
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; i++)
{
intArr[i] = (int)arraylist[i];
//sb.Append(intArr[i].ToString() + " ");
}
this.textBox1.Text = sb.ToString();
}
sw.Stop();
MessageBox.Show(sw.ElapsedMilliseconds.ToString()+"毫秒");
}
我自己改进后的:
private void btnOK2_Click(object sender, EventArgs e)
{
int length = 0;
string strLength = Microsoft.VisualBasic.Interaction.InputBox("请输入数组长度", "输入框", "100", 400, 300);
Int32.TryParse(strLength, out length);
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
if (length != 0)
{
int[] intArr = new int[length];
ArrayList arraylist = new ArrayList();
for (int i = 0; i < length; i++)
{
arraylist.Add(i+1);
}
Random ran = new Random();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; i++)
{
int num = ran.Next(0, arraylist.Count);
intArr[i] = (int)arraylist[num];
arraylist.RemoveAt(num);
//sb.Append(intArr[i].ToString() + " ");
}
this.textBox1.Text = sb.ToString();
}
sw.Stop();
MessageBox.Show(sw.ElapsedMilliseconds.ToString() + "毫秒");
}
byQQ:443537525
标准答案:
private void btnOK1_Click(object sender, EventArgs e)
{
int length = 0;
string strLength = Microsoft.VisualBasic.Interaction.InputBox("请输入数组长度", "输入框", "100", 400, 300);
Int32.TryParse(strLength, out length);
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
if (length != 0)
{
int[] intArr = new int[length];
ArrayList arraylist = new ArrayList();
Random ran = new Random();
while (arraylist.Count < length)
{
int num = ran.Next(1, length + 1);
if (!arraylist.Contains(num))
{
arraylist.Add(num);
}
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; i++)
{
intArr[i] = (int)arraylist[i];
//sb.Append(intArr[i].ToString() + " ");
}
this.textBox1.Text = sb.ToString();
}
sw.Stop();
MessageBox.Show(sw.ElapsedMilliseconds.ToString()+"毫秒");
}
我自己改进后的:
private void btnOK2_Click(object sender, EventArgs e)
{
int length = 0;
string strLength = Microsoft.VisualBasic.Interaction.InputBox("请输入数组长度", "输入框", "100", 400, 300);
Int32.TryParse(strLength, out length);
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
if (length != 0)
{
int[] intArr = new int[length];
ArrayList arraylist = new ArrayList();
for (int i = 0; i < length; i++)
{
arraylist.Add(i+1);
}
Random ran = new Random();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; i++)
{
int num = ran.Next(0, arraylist.Count);
intArr[i] = (int)arraylist[num];
arraylist.RemoveAt(num);
//sb.Append(intArr[i].ToString() + " ");
}
this.textBox1.Text = sb.ToString();
}
sw.Stop();
MessageBox.Show(sw.ElapsedMilliseconds.ToString() + "毫秒");
}
byQQ:443537525
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int a[54] = {0};
int i, n;
srand(time(NULL));
for( i=1; i<=54; i++ )
{
while( a[ (n=rand()%54) ] );
a[n] = i;
}
for( i=0; i<54; i++ )
printf("%d ", a[i]);
return 0;
}
#include <time.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int a[54] = {0};
int i, n;
srand(time(NULL));
for( i=1; i<=54; i++ )
{
while( a[ (n=rand()%54) ] );
a[n] = i;
}
for( i=0; i<54; i++ )
printf("%d ", a[i]);
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询