为随机和非重复创建数字

时间:2016-02-24 10:22:16

标签: c# random numbers

我是代码:

       Random rand = new Random();
       int[] arr = new int[4];
       for (int i = 0; i < 4; i++)
       {
           for (int k = 0; k < 4; k++)
           {
               int rad = rand.Next(1, 5);
               if (arr[k] != rad)
                   arr[i] = rad;
           }
       }
       for (int i = 0; i < 4; i++)
           MessageBox.Show(arr[i].ToString());

我想从凌晨1点到凌晨4点生产数字并且彼此不平等。 TNX。

4 个答案:

答案 0 :(得分:2)

创建一个包含唯一元素的数组,然后对其进行随机播放,就像在下面的代码中一样,它会以一个随机的顺序对数组进行洗牌,它使用Fisher-Yates shuffle algorithm

        List<CardPurchaseDetail> cardsPurchased = cardPurchaseDetailDao.getPurchaseDetails(cardPurchase.getPurchaseNumber());
        if(cardsPurchased != null && cardsPurchased.size() > 0){
            int ctr = 0;
            for(CardPurchaseDetail cardPurchased : cardsPurchased){
                CardMaster card = cardMasterDao.getCardDetails(cardPurchased.getPk().getCardNumber());
                if(ctr > 0){
                    table.addCell(" ");
                    table.addCell(" ");
                    table.addCell(" ");
                    table.addCell(" ");
                    table.addCell(" ");
                    table.addCell(" ");
                    table.addCell(" ");
                    table.addCell(" ");
                    table.addCell(" ");
                    table.addCell(" ");
                    table.addCell(" ");
                    table.addCell(" ");
                    table.addCell(" ");
                    table.addCell(" ");
                    table.addCell(" ");
                    table.addCell(" ");
                }
                table.addCell(bodyFontStyle (card.getPk().getCardNumber()));    
                table.addCell(bodyFontStyle (card.getStatus()));
                table.addCell(bodyFontStyle (card.getAmount().toString()));
                ctr++;
            }
        } else {
            table.addCell(" ");
            table.addCell(" ");
            table.addCell(" ");
        }

可以找到in this post的解释和模板版本的算法,但Jon Skeet的回答很好。

int N = 20;
var theArray = new int[N];
for (int i = 0; i < N; i++)
    theArray[i] = i;

Shuffle(theArray);

public static void Shuffle(int[] a) {
    if (a == null) throw new ArgumentNullException("Array is null");
    int n = a.Length;
    var theRandom = new Random();
    for (int i = 0; i < n; i++) {
        int r = i + theRandom.Next(n-i);     // between i and n-1
        int temp = a[i];
        a[i] = a[r];
        a[r] = temp;
    }
}

答案 1 :(得分:2)

反过来考虑一下:

而不是:

  

生成一个数字 然后 检查它是否重复

你这样做:

  

你已经拥有一组非重复数字, 然后 你接受了它   一个接一个 - 删除重复的可能性。

这样的事情会:

List<int> list = Enumerable.Range(1, 4).ToList();
List<int> rndList = new List<int>();
Random rnd = new Random();
int no = 0;
for (int i = 0; i < 4; ++i) {
    no = rnd.Next(0, list.Count);
    rndList.Add(list[no]);
    list.Remove(list[no]);
}

结果在rndList

这样,不会发生重复。

答案 2 :(得分:1)

创建一个包含所需数字的列表,然后将它们随机播放:

var rnd = new Random();
List<int> rndList = Enumerable.Range(1, 4).OrderBy(r => rnd.Next()).ToList();

如果你想要一个数组而不是一个列表:

var rnd = new Random();
int[] rndArray = Enumerable.Range(1, 4).OrderBy(r => rnd.Next()).ToArray();

答案 3 :(得分:-2)

<failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><not-authorized/><text lang="en">Password not verified</text></failure>" UserInfo=0x1a4e8c00 {NSLocalizedDescription=<failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><not-authorized/><text lang="en">Password not verified</text></failure>})