Get Random Color [duplicate]
Asked Answered
P

2

29

Do you know any method to generate a random Color (not a random Color Name!)?

I've already got one, but this one is'nt doing it correctly:

This only returns Green:

Random r = new Random();
BackColor = Color.FromArgb(r.Next(0, 256), r.Next(0, 256), 0);

This only returns Red:

Random r = new Random();
BackColor = Color.FromArgb(r.Next(0, 256), 0, 0);

This only returns Blue:

Random r = new Random();
BackColor = Color.FromArgb(0, 0, r.Next(0, 256));

I want my Code to return one, random Color, not only green/red/blue every time, as the above ones do.

How to solve this?

Any suggestion will be approved with joy!

Pinter answered 22/3, 2015 at 18:18 Comment(3)
Why do you think the last code returns only Blue?Assembler
2) returns red because you are only setting the Red channel. 3) Returns blue because you are only setting the blue channel 1) Be careful that the two random you are picking probably equal each other since they are almost picked at the same timeUndecagon
The code in the duplicate question (not the answer) is what you are looking forOpenhearted
O
50

Here's the answer I started posting before you deleted and then un-deleted your question:

public partial class Form1 : Form
{
    private Random rnd = new Random();

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {  
        Color randomColor = Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256));

        BackColor = randomColor;
    }
}
Openhearted answered 22/3, 2015 at 18:40 Comment(1)
The above code did not work for me inside WPF project. Needed to cast the random values to a byte. Color.FromArgb((byte) rnd.Next(0, 256), (byte) rnd.Next(0, 256), (byte) rnd.Next(0, 256), (byte) rnd.Next(0, 256))Mistiemistime
E
8

The original version of your last method (pre-Edit) will return all different sorts of colors. I would be sure to use a single Random object rather than create a new one each time:

Random r = new Random();
private void button6_Click(object sender, EventArgs e)
{
    pictureBox1.BackColor = Color.FromArgb(r.Next(0, 256), 
         r.Next(0, 256), r.Next(0, 256));

    Console.WriteLine(pictureBox1.BackColor.ToString());
}

It produces all sorts of different colors:

Color [A=255, R=241, G=10, B=200]
Color [A=255, R=41, G=125, B=132]
Color [A=255, R=221, G=169, B=109]
Color [A=255, R=228, G=152, B=197]
Color [A=255, R=50, G=153, B=103]
Color [A=255, R=92, G=236, B=162]
Color [A=255, R=52, G=103, B=204]
Color [A=255, R=197, G=126, B=133]

Ephram answered 22/3, 2015 at 18:36 Comment(1)
Exactly, the problem the OP was most likely having was creating a new random each time and then calling .Next, rather than re-using a global Random object.Openhearted

© 2022 - 2024 — McMap. All rights reserved.