Somebody sent me an email today asking me about an article I wrote a few years ago detailing how to generate random strings and numbers in C# and VB.NET. He asked me if I could add function to the code that creates a random character set to be used as a base for the allowed characters in the random string. I went on and hammered the solution and this what I built for him. I don't have enough time to explain the whole thing but I hope the code comments I added would be good enough to understand what I did with the code.
[----------------- C# Version -----------------]
using System;
using System.Collections.Generic;
using System.Text;
namespace KeithRull.ConsoleCentral
{
class RandomStrings
{
//our default string size
private const int CONST_MaxStringLenght = 10;
//our default character string set
private const string CONST_AllowedCharacterLiterals
= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
//our randomizer
Random randomNumber = new Random();
/// <summary>
/// Generate a random string using the default options
/// </summary>
/// <returns>the random string</returns>
public string GenerateRandomString()
{
return GenerateRandomString(CONST_MaxStringLenght);
}
/// <summary>
/// Create a random string based on a specified lenght
/// </summary>
/// <param name="lenght">the lenght of the desired lenght of the random string</param>
/// <returns>the randomized string</returns>
public string GenerateRandomString(int lenght)
{
return GenerateRandomString(lenght, CreateRandomStringSet());
}
/// <summary>
/// Creates a random string based on a specific lenght and character set
/// </summary>
/// <param name="lenght">the lenght of the desired lenght of the random string</param>
/// <param name="charsToUse">character set to use</param>
/// <param name="randomizeSourceSet">defines whether the source set should be scrambled</param>
/// <returns>the random string</returns>
public string GenerateRandomString(int lenght, string charsToUse, bool randomizeSourceSet)
{
string randomString = String.Empty;
if (randomizeSourceSet) {
//scramble and jumble it
randomString = GenerateRandomString(lenght, CreateRandomStringSet(charsToUse));
}
else {
//use the default charset
randomString = GenerateRandomString(lenght, charsToUse);
}
return randomString;
}
/// <summary>
/// Creates a random string based on a specific lenght and character set
/// </summary>
/// <param name="lenght">the lenght of the desired lenght of the random string</param>
/// <param name="charsToUse">character set to use</param>
/// <returns>the random string</returns>
public string GenerateRandomString(int lenght, string charsToUse)
{
//Create a new StringBuilder that would hold the random string.
StringBuilder randomString = new StringBuilder();
//Create a variable to hold the generated charater.
char appendedChar;
//Create a loop that would iterate from 0 to the specified value of intLenghtOfString
for (int i = 0; i <= lenght; ++i)
{
int characterIndex = Convert.ToInt32(randomNumber.Next(i, charsToUse.Length - i));
//Generate the char and assign it to appendedChar
appendedChar = charsToUse[characterIndex];
//Append appendedChar to randomString
randomString.Append(appendedChar);
}
//Convert randomString to String and return the result.
return randomString.ToString();
}
/// <summary>
/// Returns a random set of characters based on the default literal set
/// </summary>
/// <returns>the random string</returns>
private string CreateRandomStringSet()
{
//just use the default character set
return CreateRandomStringSet(CONST_AllowedCharacterLiterals);
}
/// <summary>
/// A function that returns a new set of characters based on an input set
/// </summary>
/// <param name="allowedCharacters">the source set</param>
/// <returns>the new collection of characters</returns>
private string CreateRandomStringSet(string allowedCharacters)
{
string randomizedString = String.Empty;
//get a random string set size
int randomSetLenght = allowedCharacters.Length * randomNumber.Next(1, CONST_MaxStringLenght);
//while lenght of the random set is not the same as the source string lenght
while (randomizedString.Length != randomSetLenght)
{
//add a new character
randomizedString += GetRandomCharFromString(allowedCharacters);
}
//return our random string
return randomizedString;
}
/// <summary>
/// Gets a character from the the input string
/// </summary>
/// <param name="allowedCharacters">source string</param>
/// <returns>a random character</returns>
private char GetRandomCharFromString(string allowedCharacters)
{
return allowedCharacters[randomNumber.Next(allowedCharacters.Length - 1)];
}
}
}
[----------------- C# Usage -----------------]
using System;
using System.Collections.Generic;
using System.Text;
namespace KeithRull.ConsoleCentral
{
class Program
{
static void Main(string[] args)
{
RandomStrings r = new RandomStrings();
Console.WriteLine(r.GenerateRandomString());
Console.WriteLine(r.GenerateRandomString(10));
Console.WriteLine(r.GenerateRandomString(10, "qwerttyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM"));
Console.WriteLine(r.GenerateRandomString(10, "[]{}<>!@#$%^&*()qwerttyuioplkjhgfdsazxcvbnm1234567890", true));
Console.WriteLine(r.GenerateRandomString(10, "qwerttyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM", false));
Console.ReadLine();
}
}
}
[----------------- VB.NET Version -----------------]
Imports System
Imports System.Collections.Generic
Imports System.Text
Namespace KeithRull.ConsoleCentral
Class RandomStrings
Private Const CONST_MaxStringLenght As Integer = 10
Private Const CONST_AllowedCharacterLiterals As String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
Private randomNumber As New Random()
''' <summary>
''' Generate a random string using the default options
''' </summary>
''' <returns>the random string</returns>
Public Function GenerateRandomString() As String
Return GenerateRandomString(CONST_MaxStringLenght)
End Function
''' <summary>
''' Create a random string based on a specified lenght
''' </summary>
''' <param name="lenght">the lenght of the desired lenght of the random string</param>
''' <returns>a random string</returns>
Public Function GenerateRandomString(ByVal lenght As Integer) As String
Return GenerateRandomString(lenght, CreateRandomStringSet())
End Function
''' <summary>
''' Creates a random string based on a specific lenght and character set
''' </summary>
''' <param name="lenght">the lenght of the desired lenght of the random string</param>
''' <param name="charsToUse">character set to use</param>
''' <param name="randomizeSourceSet">defines whether the source set should be scrambled</param>
''' <returns></returns>
Public Function GenerateRandomString(ByVal lenght As Integer, ByVal charsToUse As String, ByVal randomizeSourceSet As Boolean) As String
Dim randomString As String = [String].Empty
If randomizeSourceSet Then
'scramble and jumble it
randomString = GenerateRandomString(lenght, CreateRandomStringSet(charsToUse))
Else
'use the default charset
randomString = GenerateRandomString(lenght, charsToUse)
End If
Return randomString
End Function
Public Function GenerateRandomString(ByVal lenght As Integer, ByVal charsToUse As String) As String
'Create a new StringBuilder that would hold the random string.
Dim randomString As New StringBuilder()
'Create a variable to hold the generated charater.
Dim appendedChar As Char
For i As Integer = 0 To lenght
'Create a loop that would iterate from 0 to the specified value of intLenghtOfString
Dim characterIndex As Integer = Convert.ToInt32(randomNumber.[Next](i, charsToUse.Length - i))
'Generate the char and assign it to appendedChar
appendedChar = charsToUse(characterIndex)
'Append appendedChar to randomString
randomString.Append(appendedChar)
Next
'Convert randomString to String and return the result.
Return randomString.ToString()
End Function
''' <summary>
''' Returns a random set of characters based on the default literal set
''' </summary>
''' <returns></returns>
Private Function CreateRandomStringSet() As String
Return CreateRandomStringSet(CONST_AllowedCharacterLiterals)
End Function
''' <summary>
''' A function that returns a new set of characters based on an input set
''' </summary>
''' <param name="allowedCharacters">the source set</param>
''' <returns>the new collection of characters</returns>
Private Function CreateRandomStringSet(ByVal allowedCharacters As String) As String
Dim randomizedString As String = [String].Empty
'get a random string set size
Dim randomSetLenght As Integer = allowedCharacters.Length * randomNumber.[Next](1, CONST_MaxStringLenght)
'while lenght of the random set is not the same as the source string lenght
While randomizedString.Length <> randomSetLenght
'add a new character
randomizedString += GetRandomCharFromString(allowedCharacters)
End While
'return our random string
Return randomizedString
End Function
''' <summary>
''' Gets a character from the the input string
''' </summary>
''' <param name="allowedCharacters">source string</param>
''' <returns>a random character</returns>
Private Function GetRandomCharFromString(ByVal allowedCharacters As String) As Char
Return allowedCharacters(randomNumber.[Next](allowedCharacters.Length - 1))
End Function
End Class
End Namespace
[----------------- VB.NET Usage -----------------]
Imports System
Imports System.Collections.Generic
Imports System.Text
Namespace KeithRull.ConsoleCentral
Class Program
Private Shared Sub Main(ByVal args As String())
Dim r As RandomStrings = New RandomStrings()
Console.WriteLine(r.GenerateRandomString())
Console.WriteLine(r.GenerateRandomString(10))
Console.WriteLine(r.GenerateRandomString(10, "qwerttyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM"))
Console.WriteLine(r.GenerateRandomString(10, "[]{}<>!@#$%^&*()qwerttyuioplkjhgfdsazxcvbnm1234567890", True))
Console.WriteLine(r.GenerateRandomString(10, "qwerttyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM", False))
Console.ReadLine()
End Sub
End Class
End Namespace
[----------------- Screenshot -----------------]

And that's how you create random strings in C# and VB.NET. Interested in the source code? You can download them here. RandomStrings.cs (4.61 KB) | RandomStrings.vb (5 KB)
Posted
Nov 28 2007, 10:01 AM
by
keithrull