簡體   English   中英

我有一個函數可以創建數組並對其進行混洗,但是我不知道如何以我想要的方式調用它

[英]I have a function that makes an array and shuffles it but I don't know how to call it in the way I want to

這個函數可以創建一個數組,並從LoLim填充到HiLim ,然后重新排列順序:

 static Random random = new Random();        //these two statics are to make a random number, i need the first static to be outside the function so it won't keep making the same random number
    static int RandomNum(int LoLim, int HiLim, int index)
    {
        var nums = Enumerable.Range(LoLim,HiLim).ToArray();  //these next lines make an array from LoLim to HiLim and then shuffle it 

        for (int i = 0; i < nums.Length; i++)
        {
            int randomIndex = random.Next(nums.Length);
            int temp = nums[randomIndex];
            nums[randomIndex] = nums[i];
            nums[i] = temp;

        }
        return nums[index];

然后,我有這個功能,使二維數組,然后打印它。 它使用RandomNum但不是按照我想要的方式使用,但是我不知道如何使其工作。

static Array Matrix(int Rows, int Columns) //this is a function to initiate and print the array
    {
        int[,] LotteryArray = new int[Rows, Columns];

        for (int i = 0; i < LotteryArray.GetLength(0); i++)  //this is a series of loops to initiate and print the array
        {
            for (int j = 0; j < LotteryArray.GetLength(1); j++)
            {
                LotteryArray[i, j] = RandomNum(1,46,j);       //the numbers are supposed to be between 1 and 45, so i tell it to do it until 46 because the upper limit is exclusive
                Console.Write("{0,3},", LotteryArray[i, j]); //the {0,3} the 3 is three spaces after the first variable
            }
            Console.WriteLine();
        }
        return LotteryArray;

基本上,我希望它在每個“行”中都調用RandomNum這樣它可以對數組進行隨機組合,然后希望它提取nums[index]並打印出來。 我想要這樣做的原因是這樣,我可以在每一行中使用非重復的隨機數。 例如:我不希望一行為“ 21、4、21、5、40、30”。

即使代碼有效,您的代碼也會出現各種問題。 “邏輯”問題是:

  • 您正在使用偏向混洗算法。 您應該使用Fisher-Yates進行正確的改組(請參閱http://blog.codinghorror.com/the-danger-of-naivete/
  • 如果您確實想進行“良好”改組,則不應使用Random數生成器,而應使用RNGCryptoServiceProvider (請參閱http://www.cigital.com/papers/download/developer_gambling.php ,但請注意,這是一個比其他問題要少得多的問題……如果生成的混洗都是等概率的,我們可以通過“隨機性稍差”混洗生存下來)
  • 您錯誤地使用了Enumerable.Range()的參數

您的編碼問題有所不同:您必須經過改組的行保存在某個地方,然后獲取第一列的值。

在這里,我正在使用一個類,通過改組封裝行

public class ShuffledRow
{
    public static readonly Random Random = new Random();
    public readonly int[] Row;

    /// <summary>
    /// Generates and shuffles some numbers
    /// from min to max-1
    /// </summary>
    /// <param name="min"></param>
    /// <param name="max">Max is excluded</param>
    public ShuffledRow(int min, int max)
    {
        int count = max - min;
        Row = Enumerable.Range(min, count).ToArray();
        Shuffle(Row);
    }

    private static void Shuffle<T>(T[] array)
    {
        // Fisher-Yates correct shuffling
        for (int i = array.Length - 1; i > 0; i--)
        {
            int j = Random.Next(i + 1);
            T temp = array[i];
            array[i] = array[j];
            array[j] = temp;
        }
    }
}

另一個問題:除非您知道自己在做什么,否則請不要在C#中使用多維數組。 可悲的是,他們是.NET的一個混蛋而被遺忘的孩子。 使用鋸齒狀數組(數組數組)。

public static int[][] Matrix(int rows, int columns)
{
    int[][] lottery = new int[rows][];

    for (int i = 0; i < lottery.Length; i++)
    {
        ShuffledRow sr = new ShuffledRow(1, 46);

        lottery[i] = sr.Row;
        Array.Resize(ref lottery[i], columns);
        Console.WriteLine(
            string.Join(",", lottery[i].Select(
                x => string.Format("{0,3}", x))));
    }

    return lottery;
}

public static int[][] Matrix(int rows, int columns)
{
    int[][] lottery = new int[rows][];

    for (int i = 0; i < lottery.Length; i++)
    {
        ShuffledRow sr = new ShuffledRow(1, 46);

        lottery[i] = new int[columns];

        for (int j = 0; j < columns; j++)
        {
            lottery[i][j] = sr.Row[j];
            Console.Write("{0,3},", lottery[i][j]);
        }

        Console.WriteLine();
    }

    return lottery;
}

我准備了Matrix函數的兩個版本,一個版本與您使用的版本更相似,一個版本更多的是LINQ和“高級”。

要生成隨機數真的不使用隨機函數,請使用以下命令:

private static RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider();
    // Main method. 
    public static int[] generateTrueRandomOK()
    {
        const int totalRolls = 2500;
        int[] results = new int[50]; //Number of random ints that you need

        // Roll the dice 25000 times and display 
        // the results to the console. 
        for (int x = 0; x < totalRolls; x++)
        {
            byte roll = RollDice((byte)results.Length);
            results[roll - 1]++;
        }

        return results;
    }

    // This method simulates a roll of the dice. The input parameter is the 
    // number of sides of the dice. 

    public static byte RollDice(byte numberSides)
    {
        if (numberSides <= 0)
            throw new ArgumentOutOfRangeException("numberSides");

        // Create a byte array to hold the random value. 
        byte[] randomNumber = new byte[1];
        do
        {
            // Fill the array with a random value.
            rngCsp.GetBytes(randomNumber);
        }
        while (!IsFairRoll(randomNumber[0], numberSides));
        // Return the random number mod the number 
        // of sides.  The possible values are zero- 
        // based, so we add one. 
        return (byte)((randomNumber[0] % numberSides) + 1);
    }

    private static bool IsFairRoll(byte roll, byte numSides)
    {
        // There are MaxValue / numSides full sets of numbers that can come up 
        // in a single byte.  For instance, if we have a 6 sided die, there are 
        // 42 full sets of 1-6 that come up.  The 43rd set is incomplete. 
        int fullSetsOfValues = Byte.MaxValue / numSides;

        // If the roll is within this range of fair values, then we let it continue. 
        // In the 6 sided die case, a roll between 0 and 251 is allowed.  (We use 
        // < rather than <= since the = portion allows through an extra 0 value). 
        // 252 through 255 would provide an extra 0, 1, 2, 3 so they are not fair 
        // to use. 
        return roll < numSides * fullSetsOfValues;
    }

您可以使用鋸齒狀數組:

Random random = new Random(); 
int[] RandomNum(int LoLim, int HiLim)
{
    var nums = Enumerable.Range(LoLim,HiLim).ToArray();

    for (int i = 0; i < nums.Length; i++)
    {
        int randomIndex = random.Next(nums.Length);
        int temp = nums[randomIndex];
        nums[randomIndex] = nums[i];
        nums[i] = temp;

    }

    return nums;
}

int[][] Matrix(int Rows, int Columns)
{
    int[][] LotteryArray = new int[Rows][];

    for (int i = 0; i < LotteryArray.Length; i++)
    {
        LotteryArray[i] = RandomNum(1,46);

        for (int j = 0; j < LotteryArray[i].Length; j++)
        {
           Console.Write("{0,3},", LotteryArray[i][j]);
        }

        Console.WriteLine();
    }

    return LotteryArray;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM