当前位置:编程学习 > C#/ASP.NET >>

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的代码:

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();
}
--------------------编程问答-------------------- 楼上的,他还要判断和为97呢

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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,