.NET Fiddle

CSharp · Console

/Program.cs

using System;
using System.Security.Cryptography;
	
public class Program
{
	public static void Main()
	{
		Console.WriteLine(GeneratePassword(15, 3));
		Console.WriteLine(GeneratePassword(15, 3));
		Console.WriteLine(GeneratePassword(15, 3));
		Console.WriteLine(GeneratePassword(15, 3));
	}
	
	public static string GeneratePassword(int length, int numberOfNonAlphanumericCharacters)
	{
		const string allowedChars = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789";
		const string nonAlphanumericChars = "!@#$%^&*()_-+=[{]};:<>|./?";
		var randNum = new byte[4];
		using (var rng = RandomNumberGenerator.Create())
		{
			rng.GetBytes(randNum);
			var randomSeed = BitConverter.ToInt32(randNum, 0);
			var random = new Random(randomSeed);
			var chars = new char[length];
			var allowedCharCount = allowedChars.Length;
			var nonAlphanumericCharCount = nonAlphanumericChars.Length;
			var numNonAlphanumericCharsAdded = 0;
			for (var i = 0; i < length; i++)
			{
				if (numNonAlphanumericCharsAdded < numberOfNonAlphanumericCharacters && i < length - 1)
				{
					chars[i] = nonAlphanumericChars[random.Next(nonAlphanumericCharCount)];
					numNonAlphanumericCharsAdded++;
				}
				else
				{
					chars[i] = allowedChars[random.Next(allowedCharCount)];
				}
			}
			return new string(chars);
		}
	}

}
;