Search Unity

Generate 9 values with different values

Discussion in 'Scripting' started by ScamTheMan, Jul 3, 2020.

  1. ScamTheMan

    ScamTheMan

    Joined:
    Oct 4, 2018
    Posts:
    75
    Hello, I want to generate 9 numbers in array in range from 1 to 9 but with different value(e.g. 8,2,3,1,6,5,9,4,7 so there won't be the same value somewhere)

    This is what I tried, but it doesn't work, it still generate sometimes the same number as previous
    Code (CSharp):
    1. for (int x = 0; x <= 8; x++)
    2.         {
    3.             Number[x] = Random.Range(1, 10);
    4.          }
    5.  
    6. for (int x = 0; x <= 8; x++)
    7.         {
    8.             for (int z = 0; z <= 8; z++)
    9.             {
    10.                 if (x == z)
    11.                 {
    12.                 }
    13.                 else
    14.                 {
    15.                     while (Number[x] == Number[z])
    16.                     {
    17.                         Number[x] = Random.Range(1, 10);
    18.                         print("Changed Number to: " + Number[x]);
    19.                         repeat++;
    20.                         print("Changed "+ repeat + " times");
    21.                     }
    22.                     repeat = 0;
    23.                 }
    24.             }
    25.         }
    Thank you for any help.
     
  2. Zer0Cool

    Zer0Cool

    Joined:
    Oct 24, 2014
    Posts:
    203
    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4.  
    5. public class NumberGenerator : MonoBehaviour
    6. {
    7.     public void Start()
    8.     {
    9.         HashSet<int> numbers = new HashSet<int>();
    10.         while (numbers.Count< 9)
    11.         {
    12.             int number = Random.Range(1, 10);
    13.             if (!numbers.Contains(number)) numbers.Add(number);
    14.         }
    15.  
    16.         foreach (int number in numbers)
    17.         {
    18.             Debug.Log(number);
    19.         }
    20.     }
    21.  
    22. }
    This is only 1 method (not fastest) you could also simply shuffle the 9 numbers in their slots
     
    Last edited: Jul 3, 2020
  3. Elango

    Elango

    Joined:
    Jan 27, 2016
    Posts:
    107
    Last edited: Jul 3, 2020
    PraetorBlue likes this.
  4. Zer0Cool

    Zer0Cool

    Joined:
    Oct 24, 2014
    Posts:
    203
    Here the shuffle version too:

    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4.  
    5. public class NumberGenerator : MonoBehaviour
    6. {
    7.     public void Start()
    8.     {
    9.         //GenerateByHash();
    10.         GenerateByShuffle();
    11.      }
    12.  
    13.     public void GenerateByShuffle()
    14.     {
    15.         int[] numbers = new int[9];
    16.         int index = 0;
    17.         foreach (int number in numbers)
    18.         {
    19.             numbers[index] = index + 1;
    20.             index++;
    21.         }
    22.  
    23.         ShuffleArray(numbers); // you can call this shuffle method several times to get better or other random results, but normally it should be enough
    24.  
    25.         foreach (int number in numbers)
    26.         {
    27.             Debug.Log(number);
    28.         }
    29.     }
    30.  
    31.     // Shuffles 9 times 2 slots
    32.     public void ShuffleArray(int[] numbers)
    33.     {
    34.         int index = 0;
    35.         foreach (int number in numbers)
    36.         {
    37.             int slotValue = numbers[index];
    38.             int rndIndex = Random.Range(0, 9);
    39.             numbers[index] = numbers[rndIndex];
    40.             numbers[rndIndex] = slotValue;
    41.             index++;
    42.         }
    43.     }
    44.  
    45.     public void GenerateByHash()
    46.     {
    47.         HashSet<int> numbers = new HashSet<int>();
    48.         while (numbers.Count < 9)
    49.         {
    50.             int number = Random.Range(1, 10);
    51.             if (!numbers.Contains(number)) numbers.Add(number);
    52.         }
    53.  
    54.         foreach (int number in numbers)
    55.         {
    56.             Debug.Log(number);
    57.         }
    58.     }
    59.  
    60. }
     
    Last edited: Jul 3, 2020