none
请教一个随机高效抽取string数组里面的数据的高效办法 谢谢 RRS feed

答案

  • 请教 一个数组 如何高效率抽取里面80%的数据

    string[] a = { "1", "2", "3", "4", "5", "1" };

    谢谢


    namespace A
    {
        class Program
        {
            static void Main(string[] args)
            {
                string[] a = { "1""2""3""4""5""6""1""2""3""4" };
                List<string> arr = new List<string>();
                Random r = new Random(DateTime.Now.Millisecond);
                for (int i = 1i <= a.Lengthi++)
                {
                    arr.Insert(r.Next(0arr.Count), a[i - 1]);
                }
                int n = arr.Count;

                for (int i = 1i <= n * 0.2i++)
                {
                    arr.Remove(arr[r.Next(0arr.Count)]);
                }

                foreach (var item in arr)
                {
                    Console.WriteLine(item);
                }
            }
        }
    }
    请参考:http://social.msdn.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/97a26a3f-2ba4-42b2-8182-9e257db047a5/#97a26a3f-2ba4-42b2-8182-9e257db047a5

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年12月21日 3:01
    版主
  • string[] result=a.OrderBy(b=>Guid.NewGuid()).Take((int)(a.Count()*0.8)).ToArray();


    Best Regards,
    If a post answers your question, please click "Mark As Answer" on that post and "Mark as Helpful".
    • 已标记为答案 yyyukai 2011年12月21日 6:39
    2011年12月21日 6:33
  • Hi Wei_Dong,

    我贴得斜体字代码是针对以前的代码的,但思路是一样的

    我把这个问题的解法写一下:

    //代码在vs2010中运行通过

     //窗体中加了一个 label1 ,一个button1;

     int count = 0;   //用来循环输出结果用的指针  0到5间循环
      string[] a = { "1", "2", "3", "4", "5", "1" };
    string []result=new string [6];// 用来储存结果

    //窗体加载时对 数组 a排序

     private void Form1_Load(object sender, EventArgs e)
            {
                SortA(a );
            }

    // 按键后在 label1上显示结果,看问题想表达的好像是一次输出一个值

    //对count做出判断,如果结果输出一遍了 就重新洗牌,把结果指针置0
                   private void button1_Click(object sender, EventArgs e)
            {
                label1 .Text =result [count ];
                if (count < 5)
                    count++;
                else
                {
                    count = 0;
                    SortA(result);
                }

            }

     

    //洗牌用的
            private void SortA(string[] sa)
            {
                Random rand = new Random();
                for (int i = 0; i < 6; i++)
                {
                    int index = rand.Next(6);
                    string tempA = sa [i];
                    sa[i] = sa[index];
                    sa[index] = tempA;
                }
                result = sa;
            }

     

    这个可以把数组a的值 100% 抽取到

    • 已建议为答案 Allen PPL 2011年12月23日 12:05
    • 已标记为答案 yyyukai 2011年12月24日 6:55
    2011年12月23日 12:04

全部回复

  • 请教 一个数组 如何高效率抽取里面80%的数据

    string[] a = { "1", "2", "3", "4", "5", "1" };

    谢谢


    namespace A
    {
        class Program
        {
            static void Main(string[] args)
            {
                string[] a = { "1""2""3""4""5""6""1""2""3""4" };
                List<string> arr = new List<string>();
                Random r = new Random(DateTime.Now.Millisecond);
                for (int i = 1i <= a.Lengthi++)
                {
                    arr.Insert(r.Next(0arr.Count), a[i - 1]);
                }
                int n = arr.Count;

                for (int i = 1i <= n * 0.2i++)
                {
                    arr.Remove(arr[r.Next(0arr.Count)]);
                }

                foreach (var item in arr)
                {
                    Console.WriteLine(item);
                }
            }
        }
    }
    请参考:http://social.msdn.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/97a26a3f-2ba4-42b2-8182-9e257db047a5/#97a26a3f-2ba4-42b2-8182-9e257db047a5

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年12月21日 3:01
    版主
  • string[] result=a.OrderBy(b=>Guid.NewGuid()).Take((int)(a.Count()*0.8)).ToArray();


    Best Regards,
    If a post answers your question, please click "Mark As Answer" on that post and "Mark as Helpful".
    • 已标记为答案 yyyukai 2011年12月21日 6:39
    2011年12月21日 6:33
  • 2.0的
    2011年12月21日 6:38
  • 这个可以保证 随机 高效率的抽取里面 100%的数据

    下边的文字是摘自 胖胖亮(也就是我)09年对一个问题的解答,对你这个问题也同样适用,只要你抽取6次后重新再重新洗一次牌就行了,抽取100%,一网打尽,不会漏掉一个,而且是随机的。。。

     

    我有好的思路,是从一个洗牌程序启发的,我还写了个抽取彩票呢!
                int[] numbers=new int [20];     //建立一个数组
                Random rand=new Random (); //生成随机数
                string result="";                    //保存结果
                for (int i = 0; i < 20; i++)       //初始化数组
                    numbers[i] = i+1;
                for (int i = 0; i < 20; i++)          //洗牌
                  {
                    int temp = rand.Next(20);
                    int tempNumber = numbers[i ];
                    numbers[i] = numbers[temp ];
                    numbers[temp] =tempNumber ;
                  }
                for (int i = 0; i < 4; i++)          //这个用来排列你想要的那4个数
                    for (int j = 0; j < 4; j++)        
                    {                                           //你不需要就去掉它
                        int temp;
                        if (numbers[i] < numbers[j])
                        {
                            temp = numbers[j];
                            numbers[j] = numbers[i];
                            numbers[i] = temp;
                        }
                        else
                            continue;
                    }                                         //生成结果项
                        for (int i = 0; i < 4; i++)
                            result += "result" + i.ToString() + "==>" + numbers[i].ToString() + Environment.NewLine;
                          MessageBox.Show(result );     //输出结果


    这个思路挺好的,洗牌程序都应该是这样的 我感觉。

     
    2009年5月9日 8:57

    隐约有歌

    这里面得解答胖胖亮的洗牌解法是最优的。

    首先创建一个大小为 N 的数组 array,目的是打乱这个数组,使得里面的元素随机分布。
    如何打乱呢?
    设 I = N - 1,然后用Randam产生一个 1 - N 的随机数。假设得到的结果是 J。那么就交换 array[I] 和 array[J]
    把 I 减少1. 继续循环,一直到 I = 0


    这里,若是我们只需要 M 个随机数,那么就不用把 I 减少到 0,减少到 N - M 即可,也就是循环 M 次。那么数组前 M 个元素就是输出。

     

    我现在非常郁闷 我以前的ID 胖胖亮 那个 没法用了  有谁有办法让我重新使用 胖胖亮 那个ID啊 

    • 已建议为答案 Allen PPL 2011年12月22日 3:08
    • 取消建议作为答案 Allen PPL 2011年12月23日 12:35
    2011年12月21日 15:03
  • 我现在非常郁闷 我以前的ID 胖胖亮 那个 没法用了  有谁有办法让我重新使用 胖胖亮 那个ID啊 

    建议你把这个帖子发送到微软MSDN中文网站用户意见建议反馈专区。会有专人负责的,谢谢你的回复!

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年12月22日 3:11
    版主
  • @Wei_Dong

    谢谢

    我的解法你没有评价。。。

    2011年12月22日 4:26
  • @Wei_Dong

    谢谢

    我的解法你没有评价。。。


    我看了你的算法,前半部分(洗牌)是完全可以随机的。没有问题。

    就是后面(洗牌)后面,好像你排序了?就根据题目而言,我以为只要随机乱序以后,从头输出规定数目的数字就可以了,呵呵。你不妨修正一下,或许提问者可以标记成答案……


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年12月23日 7:58
    版主
  • Hi Wei_Dong,

    我贴得斜体字代码是针对以前的代码的,但思路是一样的

    我把这个问题的解法写一下:

    //代码在vs2010中运行通过

     //窗体中加了一个 label1 ,一个button1;

     int count = 0;   //用来循环输出结果用的指针  0到5间循环
      string[] a = { "1", "2", "3", "4", "5", "1" };
    string []result=new string [6];// 用来储存结果

    //窗体加载时对 数组 a排序

     private void Form1_Load(object sender, EventArgs e)
            {
                SortA(a );
            }

    // 按键后在 label1上显示结果,看问题想表达的好像是一次输出一个值

    //对count做出判断,如果结果输出一遍了 就重新洗牌,把结果指针置0
                   private void button1_Click(object sender, EventArgs e)
            {
                label1 .Text =result [count ];
                if (count < 5)
                    count++;
                else
                {
                    count = 0;
                    SortA(result);
                }

            }

     

    //洗牌用的
            private void SortA(string[] sa)
            {
                Random rand = new Random();
                for (int i = 0; i < 6; i++)
                {
                    int index = rand.Next(6);
                    string tempA = sa [i];
                    sa[i] = sa[index];
                    sa[index] = tempA;
                }
                result = sa;
            }

     

    这个可以把数组a的值 100% 抽取到

    • 已建议为答案 Allen PPL 2011年12月23日 12:05
    • 已标记为答案 yyyukai 2011年12月24日 6:55
    2011年12月23日 12:04