new Random()  ile yeni bir 
Random nesnesi oluşturmak her seferinde bilgisayarınızın saatine göre rastgele sayı oluşturma işlemini yeniden ayarlanıyor. Bundan sonra 
Next yöntemini çağırdığınızda aldığınız sonuç sonraki 
new Random()  ve 
Next ile alacağınız sonucun aynısı oluyor.
Bunun bir kaç çözümü var. En basitleri şunlar:
1. Tek bir 
Random nesnesi oluşturup, aynı nesne üzerinden Next yöntemini çağırın.
Örnek :
class Program
{
	
    static void Main(string[] args)
    {
        Random r = new Random();
	for (int i=0; i<100; i++) {
		Console.WriteLine(r.Next(1, 1000));
	}
        Console.ReadKey();
    }
}
2. Bu şekilde çağırmak istemezseniz ve illaki bir fonksiyon isterseniz şöyle bir şey yapabilirsiniz:
Örnek:
// Şöyle bir statik sınıf oluşturun.
public static class Cesitli
{
	public static readonly Random r = new Random();
        public static readonly Object kilitlemeNesnesi = new Object();
	// Rastgele sayı üreten fonksiyon
	public static int rastgeleSayi(int alt, int ust) {
              lock(kilitlemeNesnesi) {
                    return random.Next(min, max);
              }  
	}
}
// Kullanımı
class Program
{
    static void Main(string[] args)
    {
	for (int i=0; i<100; i++) {
		Console.WriteLine(Cesitli.rastgeleSayi(1, 1000));
	}
        Console.ReadKey();
    }
}
Bu örnekteki 
lock, 
Random nesnesi statik tanımlandığından, aynı fonksiyon başka bir iş parçası (thread) tarafından çağırılabileceği için kullanılıyor. Bilmiyorsanız 
lock (kilit) işini ayrıca incelemelisiniz. Özellikle web sitesi gibi bir ortamda kullanıyorsanız bu gerekli.
Bunların haricinde 
şurada başka yollar da belirtilmiş.