C#中random随机数重复问题

qq342038082 2017-11-15 10:47:58
private void butFirst_Click(object sender, EventArgs e)
{
butStar.Enabled = false;
timer1.Stop();
listView1.Clear();
string str = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Administrator\Desktop\vs2012lottery\Lottery.mdb";
OleDbConnection conn = new OleDbConnection(str);
conn.Open();
for (int i = 0; i < 5; i++)//一次产生5条抽奖记录
{
Random rand = new Random(Guid.NewGuid().GetHashCode());
int randkey = rand.Next(1, 400);
string select = "select DISTINCT [Number], [Name], [Department] from lottery where id=" + randkey + "";
string insert = "INSERT INTO trophy ([Number], Name, Department) SELECT [Number], Name, Department FROM lottery WHERE (id = " + randkey + ")";

OleDbCommand cmd = new OleDbCommand(select, conn);
OleDbCommand md = new OleDbCommand(insert, conn);

cmd.CommandType = CommandType.Text;
md.CommandType = CommandType.Text;

OleDbDataReader cr = md.ExecuteReader();
while (cr.Read())
{

}
OleDbDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
ListViewItem lt1 = new ListViewItem();//构建一个ListView的数据,存入数据库数据,以便添加到listView1的行数据中
//将数据库数据转变成ListView类型的一行数据
lt1.Text = dr["Number"].ToString();
lt1.SubItems.Add(dr["Name"].ToString());
lt1.SubItems.Add(dr["Department"].ToString());
lt1.SubItems.Add("纪念奖");
//将lt数据添加到listView1控件中
listView2.Items.Add(lt1);


}

}
conn.Close();
conn.Dispose();
listView2.SelectedItems.Clear();
listView2.Items[listView2.Items.Count - 1].Selected = true; //设置默认选中最后一行
listView2.Items[listView2.Items.Count - 1].EnsureVisible(); //设置滚动条自动向下滚动
itrophy++;
if (itrophy == 8)
{
MessageBox.Show("纪念奖抽奖结束");
MessageBox.Show("请继续滚动名单");
this.buttrophy.Enabled = false;
this.butStar.Enabled = true;
}

}
上面是我的代码,请大家帮看看我的随机数生成应该怎么改,我编程扔很久了,最近要搞个抽奖小系统
我这个button需要点击多次,我发现生成的名单有重复数据,数据库中已经有ID字段自动编号了,现在最困扰我的就是这个随机生成数字重复问题,在网上查了很多,可能是我写的不对都没能实现。请大神帮忙上点代码谢谢。
...全文
914 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2017-11-16
  • 打赏
  • 举报
回复
直接在 access 中取随机的5条数据就得了: https://www.cnblogs.com/jclser/archive/2008/10/03/1303507.html C# 洗牌算法(建议第一种): http://blog.csdn.net/yenange/article/details/78549916
qq342038082 2017-11-16
  • 打赏
  • 举报
回复
引用 11 楼 u014033791 的回复:
这种简单的抽奖你可以这样处理: 把号码(可以不连续)放在一个数组里, 然后生成一个随机数,把这个中奖号码从数组里清掉,然后在生成一个随机数,把这个中奖号码从数据里清掉, 然后......
主要是现在不知道该怎么写了,我想法是定义一个数组,然后随机生成若干数据,插入到数组里,前提是不重复数据,然后在查询语句里直接调用数组里的数据,调用一个删除一个。可是应该怎么写,数组放在什么位置,怎么插入,怎么调用,好几年了,代码记不清了。
smileruner 2017-11-16
  • 打赏
  • 举报
回复
重复是肯定会有的。但是如果每次重复的数字一样,那就和种子有关系了
token不能为空 2017-11-16
  • 打赏
  • 举报
回复
随机数会重复不是才能体现出随机吗 想不重复肯定要自己写逻辑啊
lescper2011 2017-11-16
  • 打赏
  • 举报
回复
建议字符数多一点,9位数重复几率就很低了
凤凰居士 2017-11-16
  • 打赏
  • 举报
回复
这种简单的抽奖你可以这样处理: 把号码(可以不连续)放在一个数组里, 然后生成一个随机数,把这个中奖号码从数组里清掉,然后在生成一个随机数,把这个中奖号码从数据里清掉, 然后......
清澈的风 2017-11-16
  • 打赏
  • 举报
回复
每日回帖可得10分可用分
拜一刀 2017-11-16
  • 打赏
  • 举报
回复
引用 6 楼 qq342038082 的回复:
[quote=引用 5 楼 xuzuning的回复:]
        static void Main(string[] args)
        {
            var rnd = new Random();
            for (var i = 0; i < 20; i++)
                Console.WriteLine(rnd.Next(1, 400));
        }
有重复吗?
你生成的少,你生成200个然后在筛选下就可以看到很多重复[/quote] 看标题还以为你随机数的用法不对,随机数种子之类的问题.... 其实是你业务逻辑的问题了吧,你要是(1,400)生成五百个随机数那还肯定有重复哩,随机数就是这样的啊 你要是不希望有任何重复的话,肯定不能直接用随机数,比如四百个抽两百个,可以把四百个数据打乱顺序,抽前两百个,这就没重复了吧,或者抽一个删一个,或者遇到重复重新抽之类的
X-i-n 2017-11-16
  • 打赏
  • 举报
回复
抽奖不用考虑随机数重复不重复,扔到LIST里,随机生成Index,抽一个删一个。
zbdzjx 2017-11-16
  • 打赏
  • 举报
回复
好像有个随机排序的方法,这样就不会重复了。
qq342038082 2017-11-16
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning的回复:
        static void Main(string[] args)
{
var rnd = new Random();
for (var i = 0; i < 20; i++)
Console.WriteLine(rnd.Next(1, 400));
}
有重复吗?
你生成的少,你生成200个然后在筛选下就可以看到很多重复
tianlang_2008 2017-11-16
  • 打赏
  • 举报
回复
如果只想在插入数据库时不重复插入可以在插入语句中根据trophy中的的关键字排重
  • 打赏
  • 举报
回复

            int x = 0,y=5;

            var numbers = Enumerable.Range(1, 400).OrderBy(g => Guid.NewGuid());

            //假装抽4次
            while (x < 20)
            {
                var winNumbers = numbers.Skip(x).Take(y);

                Console.WriteLine("中奖");

                foreach (int i in winNumbers)
                {
                    Console.WriteLine(i);
                }

                x += y;

            }
xuzuning 2017-11-16
  • 打赏
  • 举报
回复
        static void Main(string[] args)
{
var rnd = new Random();
for (var i = 0; i < 20; i++)
Console.WriteLine(rnd.Next(1, 400));
}
有重复吗?
qq342038082 2017-11-15
  • 打赏
  • 举报
回复
引用 2 楼 以专业开发人员为伍的回复:
随机数字当然会有重复。 业务上不希望重复抽取记录,那么就该有相应的流程来剔除、处理重复抽取。这是你的流程设计问题,不是随机数问题(虽然,你使用随机数的方法也是比较任性地降低了效率的)。
主要是不知道该怎么写了,该在什么地方写,试过一次抽取200条数据,结果出现了80多条重复,我的思路想在全局建个数组,然后一次随机生成若干条不重复数据,然后逐个访问数组里的数据,每点击一次访问五条数据,应该就不会重复了!但是不知道怎么写怎么调用!要是有简单方法就更好了,就差这一点了,还有10多天开年会了能运行就行了,不用效率
qq342038082 2017-11-15
  • 打赏
  • 举报
回复
试过还是有重复数据呀!
  • 打赏
  • 举报
回复
随机数字当然会有重复。 业务上不希望重复抽取记录,那么就该有相应的流程来剔除、处理重复抽取。这是你的流程设计问题,不是随机数问题(虽然,你使用随机数的方法也是比较任性地降低了效率的)。
xuzuning 2017-11-15
  • 打赏
  • 举报
回复
Random rand = new Random(Guid.NewGuid().GetHashCode()); 放到循环外面,最好是全局的

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧