Search Unity

Random.Range never repeat

Discussion in 'Scripting' started by Jorjor210, May 23, 2015.

  1. Jorjor210

    Jorjor210

    Joined:
    May 3, 2015
    Posts:
    91
    So I've been looking for a while on how to make Random.Range never the same number. And i can't seem to figure it out. can anyone help me figure this out? I don't know if it will be helpful, but here's the code i am currently trying to run.
    Code (CSharp):
    1. public class GlowColorz : MonoBehaviour {
    2.     void Start () {
    3.     SpriteRenderer renderer = GetComponent<SpriteRenderer>();
    4.     renderer.color = new Color(255f, 0f, 0f, 255f);
    5.     }
    6.     void  OnTriggerEnter ( Collider info  ){
    7.         if (info.name == "Player") {
    8.             var p= Random.Range (1,8);
    9.             Debug.Log (p);
    10.         if (p == 1f) {
    11.             SpriteRenderer renderer = GetComponent<SpriteRenderer>();
    12.             renderer.color = new Color(255.0f, 255.0f, 0f, 255.0f);
    13. }
    14.             if (p == 2f) {
    15.                 SpriteRenderer renderer = GetComponent<SpriteRenderer>();
    16.                 renderer.color = new Color(255.0f, 0f, 255.0f, 255f);
    17.             }
    18.             if (p ==3f) {
    19.                 SpriteRenderer renderer = GetComponent<SpriteRenderer>();
    20.                 renderer.color = new Color(255.0f, 0f, 0f, 255.0f);
    21.             }
    22.             if (p == 4f) {
    23.                 SpriteRenderer renderer = GetComponent<SpriteRenderer>();
    24.                 renderer.color = new Color(0f, 255.0f, 255.0f, 255.0f);
    25.             }
    26.             if (p == 5f) {
    27.                 SpriteRenderer renderer = GetComponent<SpriteRenderer>();
    28.                 renderer.color = new Color(255.0f, 150.0f, 0f, 255.0f);
    29.             }
    30.             if (p == 6f) {
    31.                 SpriteRenderer renderer = GetComponent<SpriteRenderer>();
    32.                 renderer.color = new Color(0f, 255.0f, 0f, 255f);
    33.             }
    34.             if (p == 7f) {
    35.                 SpriteRenderer renderer = GetComponent<SpriteRenderer>();
    36.                 renderer.color = new Color(0f, 0f, 255f, 255f);
    37.             }
    38.     }
    39. }
    40. }
    If anyone has tips, or answers it would be greatly appreciated.
     
  2. LeftyRighty

    LeftyRighty

    Joined:
    Nov 2, 2012
    Posts:
    5,148
    is p meant to be an int or a float?

    var is untyped (*hisses*) and you're using the integer version of Random.Range(...), but your if statements are all floats :confused:
    also, might want to lookup switch statements (https://unity3d.com/learn/tutorials/modules/beginner/scripting/switch)

    if you really only want "no two integers the same in a row", store the previous value in a manager class or static variable of some sort and do
    Code (csharp):
    1.  
    2. do {
    3. p = Random.Range(0, 8);
    4. }
    5. while(p == storedValue)
    6.  
     
    Jorjor210 likes this.
  3. mgear

    mgear

    Joined:
    Aug 3, 2010
    Posts:
    9,411
  4. hpjohn

    hpjohn

    Joined:
    Aug 14, 2012
    Posts:
    2,190
    Random will always give repeats, that's just the nature of randomness
    I'd suggest a tetris 'bag', if you want one of each created before a duplicate (you might still get 2 in a row)
    http://tetris.wikia.com/wiki/Random_Generator
     
  5. Jorjor210

    Jorjor210

    Joined:
    May 3, 2015
    Posts:
    91
    kind of implemented your Idea but in a way that made sense to me :)

    Code (CSharp):
    1. public class GlowColorz : MonoBehaviour {
    2.     public int endNum;
    3.     void Start () {
    4.     SpriteRenderer renderer = GetComponent<SpriteRenderer>();
    5.     renderer.color = new Color(255f, 0f, 0f, 255f);
    6.     }
    7.     void  OnTriggerEnter ( Collider info  ){
    8.         if (info.name == "Player") {
    9.             var p= Random.Range (1,7);
    10.             while(p==endNum) {
    11.                 p= Random.Range (1, 7);
    12.                 }
    13.             endNum = p;
    14.         if (p == 1f) {
    15.             SpriteRenderer renderer = GetComponent<SpriteRenderer>();
    16.             renderer.color = new Color(255.0f, 255.0f, 0f, 255.0f);
    17. }
    18.             if (p == 2f) {
    19.                 SpriteRenderer renderer = GetComponent<SpriteRenderer>();
    20.                 renderer.color = new Color(255.0f, 0f, 255.0f, 255f);
    21.             }
    22.             if (p ==3f) {
    23.                 SpriteRenderer renderer = GetComponent<SpriteRenderer>();
    24.                 renderer.color = new Color(255.0f, 0f, 0f, 255.0f);
    25.             }
    26.             if (p == 4f) {
    27.                 SpriteRenderer renderer = GetComponent<SpriteRenderer>();
    28.                 renderer.color = new Color(0f, 255.0f, 255.0f, 255.0f);
    29.             }
    30.             if (p == 5f) {
    31.                 SpriteRenderer renderer = GetComponent<SpriteRenderer>();
    32.                 renderer.color = new Color(0f, 255.0f, 0f, 255f);
    33.             }
    34.             if (p == 6f) {
    35.                 SpriteRenderer renderer = GetComponent<SpriteRenderer>();
    36.                 renderer.color = new Color(0f, 0f, 255f, 255f);
    37.             }
    38.     }
    39. }
    40. }
     
  6. LeftyRighty

    LeftyRighty

    Joined:
    Nov 2, 2012
    Posts:
    5,148
  7. SnakeTheRipper

    SnakeTheRipper

    Joined:
    Dec 31, 2014
    Posts:
    136
    Store each number you get on a list. If the number you get it's on the least, repeat random. Else, store it.