Features

  • CustomRandom: static class for generating random integers via cryptographic RNG or System.Random, and constrained random strings.
  • RandomStringOptions: configuration for random string generation — controls length and which character sets to include (lowercase letters, uppercase letters, digits, special characters).

Class Diagram

classDiagram
    namespace Random {
        class CustomRandom {
            <<static>>
            +int NumberFromRng(int start, int end, int? differentFrom)
            +int NumberFromSystemRandom(int start, int end, int? differentFrom)
            +string Text(RandomStringOptions options, string[]? differentFrom)
        }
        class RandomStringOptions {
            +int Length
            +bool IncludeLowercase
            +bool IncludeUppercase
            +bool IncludeDigits
            +bool IncludeSpecialCharacters
        }
    }
    CustomRandom ..> RandomStringOptions : uses

Usage

Random integers

using ArturRios.Util.Random;

// Cryptographic RNG — unpredictable, preferred for security-sensitive values
int n1 = CustomRandom.NumberFromRng(1, 100);

// System.Random — faster, sufficient for non-security uses
int n2 = CustomRandom.NumberFromSystemRandom(0, 50);

// Exclude a specific value (retries until a different value is produced)
int roll = CustomRandom.NumberFromRng(1, 6, differentFrom: 3); // never returns 3

Random strings

using ArturRios.Util.Random;

// 16-character password with all character sets
var pwd = CustomRandom.Text(new RandomStringOptions
{
    Length                  = 16,
    IncludeLowercase        = true,
    IncludeUppercase        = true,
    IncludeDigits           = true,
    IncludeSpecialCharacters = true
});

// 6-digit PIN
var pin = CustomRandom.Text(new RandomStringOptions
{
    Length        = 6,
    IncludeDigits = true
});

// Avoid previously generated values (e.g., prevent session ID collisions)
var token = CustomRandom.Text(
    new RandomStringOptions { Length = 32, IncludeDigits = true, IncludeLowercase = true },
    differentFrom: existingTokens);