code.club

 找回密碼
 立即註冊
搜索
查看: 5432|回復: 4
打印 上一主題 下一主題

用亂數選出不重複的數字陣列

[複製鏈接]
跳轉到指定樓層
樓主
發表於 2021-1-23 10:43:47 | 顯示全部樓層 回帖獎勵 |倒序瀏覽 |閱讀模式
class Program
    {
        static int max =10;
        static Random r = new Random();
        static int[] a = new int[max];
        
        static bool checkOK(int n)
        {
            for(int i=0;i<max;i++)
            {
                if(n==a[i])
                {
                    return false;
                    
                }
              
            }
            return true;
        }
        static void Main(string[] args)
        {
            int x = 0;
            int i = 0;
            for (int k = 0; k < max; k++)
                a[k] = 999;
            while(i<max)
            {
                x = r.Next(1, max+1);
                if(checkOK(x))
                {
                    a[i] = x;
                    i++;
                }
            }

            for (int j = 0; j < max; j++) Console.WriteLine(a[j]);
        }

    }
回復

使用道具 舉報

沙發
 樓主| 發表於 2021-1-26 18:15:49 | 顯示全部樓層
本帖最後由 2266 於 2021-6-27 18:12 編輯

好像這是更簡單的寫法

  1. static void randomPickNoRepeat(int[] A, int n)
  2.         {
  3.             Random rnd = new Random();
  4.             int x = 0;
  5.             bool OK = true; //OK 做為檢查該數字是否可以放入陣列的旗標
  6.             for (int i = 0; i < n; i++)
  7.             {
  8.                 OK = true; //預設是true
  9.                 x = rnd.Next(n);//亂數給值從0到n-1
  10.                 for(int k=0;k<i;k++)//再從頭檢查新出的是否和已有的數字一樣
  11.                     if(A[k]==x)//如果檢查到已有該數字,則i退回一個,OK變成false,並中斷此迴圈
  12.                     {
  13.                         i--;
  14.                         OK = false;
  15.                         break;
  16.                     }
  17.                 if (OK) A[i] = x;//如果以上檢查完成並未被中斷,且OK依然為true,表示x的數字從未出現過,所以可以加到陣列中
  18.                
  19.             }

  20.         }
複製代碼
回復 支持 反對

使用道具 舉報

板凳
 樓主| 發表於 2021-1-30 12:15:20 | 顯示全部樓層
本帖最後由 2266 於 2021-6-27 18:13 編輯

最簡單!

  1. void randomPickNoRepeat(int[] a)
  2.         {
  3.             Random rnd = new Random();
  4.             for(int i=0;i<a.Length;i++)
  5.             {
  6.                 a[i] = rnd.Next(a.Length);
  7.                 //Console.WriteLine("a[" + i + "] is " + a[i]);
  8.                 for(int j=0;j<i;j++)
  9.                     if(a[j]==a[i]) //如果陣列中已有數字和目前選出來的數字一樣的話
  10.                     {
  11.                         //Console.WriteLine("Because a[" + i + "] is as the same as a[" + j + "] so i is going back to " + i + " and will ++ again.");
  12.                         i--; // i 減去一個
  13.                         break; // 立即中斷回到上面再次迴圈
  14.                     }
  15.             }
  16.         }
複製代碼
回復 支持 反對

使用道具 舉報

地板
 樓主| 發表於 2021-6-27 17:31:20 | 顯示全部樓層
用亂數打亂原有陣列之元素排序:


  1. using System.Linq;

  2. Random rnd = new Random;
  3. int[] n = new int[10]{0,1,2,3,4,5,6,7,8,9};//要先有元素
  4. n = n.OrderBy(x=>rnd.Next()).ToArray();//x可以隨意取,例如k,z什麼都行,不必先宣告。
  5. 此時n的陣列排序已亂排了。
複製代碼
回復 支持 反對

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

小黑屋|手機版|Archiver|code.club  

GMT+8, 2024-5-4 19:03 , Processed in 0.101181 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表