c#编译一个1~32随机选取4个数字,但要求4个数字都不相同,求相应的代码?

{//随机类Randomr=newRandom();//产生一个0~33的数,包括下线不包括上线inti=r.Next(0,33);richTextBox2.Text+=... {
//随机类
Random r = new Random();
//产生一个0~33的数,包括下线不包括上线

int i = r.Next(0, 33);
richTextBox2.Text += i.ToString() + "\t";

int n = r.Next(0, 33);
richTextBox2.Text += n.ToString() + "\t";

........
这样的随机选择会出现数字相同的,怎么避免选了的数字不会再选的?
求修改后可以运行的代码.....
展开
 我来答
申寒云03g
2012-06-05 · TA获得超过122个赞
知道答主
回答量:256
采纳率:100%
帮助的人:162万
展开全部
我是添加了一个TextBox控件名为textBox1用来显示随机取得的4个数字;你也可以改为RichTextBox显示

textBox1.Text = "";
ArrayList result = new ArrayList();//用来存放随即取得的数
Random r = new Random();
for (int i = 0; i < 4; i++)
{
int a = r.Next(1, 33);//存放随机取得的数
if (i != 0) // 为了第一次随机不进行比较
{
if (a == Convert.ToInt32(result[i - 1])) //比较本次随机的数是否与上一次相等
{
i--;
continue;
}
else
result.Add(a);
}
else
result.Add(a);
}
result.Sort();//将取得的数字进行排序,为了好看
//显示取得的4个数
for (int i = 0; i < 4; i++)
{
textBox1.Text += result[i] + "\t";
}
greymagic
2012-06-05
知道答主
回答量:13
采纳率:0%
帮助的人:17.3万
展开全部
一楼的代码只能求出4个随机数,无法去除重复。
二楼的理论是对的,没代码。
三楼能得出正确结果。
四楼的代码错误,只能判断相邻的两个数不重复,会出现比如“3,7,3,7”这样类似的
================================================================
Random r = new Random();
int[] n = new int[4];
for ( int i = 0; i < 4; i++ )
{
n[i] = r.Next( 0, 33 );
for ( int j = 0; j < i; j++ )
{
if ( n[i] == n[j] )
{
n[i] = r.Next( 0, 33 );
j = 0;
}
}
richTextBox2.Text += n[i].ToString() + "\t";
}
================================================================
将上面的代码复制粘贴替换掉你原来的代码即可,生成4个绝对不重复的0-33之间的随机数。
或者也可以用下面这段精简代码,效果是一样的:
================================================================
Random r = new Random();
int?[] n = new int?[4];
for ( int i = 0; i < 4; )
{
n[i] = r.Next( 0, 33 );
for ( int j = 0; j < i; j++ ) if ( n[i] == n[j] ) n[i] = null;
richTextBox2.Text += n[i] == null ? "" : n[i++].ToString() + "\t";
}
================================================================
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
醉酒银虫
2012-06-05 · TA获得超过339个赞
知道小有建树答主
回答量:235
采纳率:0%
帮助的人:256万
展开全部
Random r = new Random();
int n[] = new int[4];
int flags = 0; for(int i = 0; i<4; )
{
int num = r.Next(0,32);//楼主标题上是1-32,下面的却是0-32,不知何故
int flag = 1<<num;
if(flag&flags == 0)
{
n[i++] = num + 1;
flags&= flag;
}
}
//如果是0-33,请将flag和flags的类型声明为long
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
airroom110
2012-06-04 · TA获得超过219个赞
知道小有建树答主
回答量:498
采纳率:0%
帮助的人:115万
展开全部
用循环,做个判断,在循环里面做个判断,如果跟上面出现过的数字相同就重新再选择.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友1b491e1
2012-06-05 · TA获得超过1036个赞
知道小有建树答主
回答量:497
采纳率:0%
帮助的人:540万
展开全部
方法1。还是贴主的原始方法,用hashtable暂存一下已抽取的值,已备后面的比较。

方法2. 无需抽取,直接乱序排序,提取头4个,使用linq的话就只一句话
var res= Enumerable.Range(1, 32).OrderBy(p => Guid.NewGuid()).Take(4);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式