diff --git a/helpers/randomnumber_helpers.py b/helpers/randomnumber_helpers.py new file mode 100644 index 0000000..1766ff5 --- /dev/null +++ b/helpers/randomnumber_helpers.py @@ -0,0 +1,123 @@ +from typing import Optional, Dict, Union +import random +from pydantic import BaseModel, validator + +class RandomNumberConfig(BaseModel): + min_value: int = 1 + max_value: int = 100 + exclude_numbers: list[int] = [] + +def generate_random_number(config: RandomNumberConfig) -> int: + """ + Generate a random integer based on provided configuration. + + Args: + config: Configuration settings for random number generation + + Returns: + int: Random number within specified range + """ + valid_numbers = [n for n in range(config.min_value, config.max_value + 1) + if n not in config.exclude_numbers] + + if not valid_numbers: + raise ValueError("No valid numbers available in specified range") + + return random.choice(valid_numbers) + +def generate_random_number_sequence( + count: int, + config: RandomNumberConfig +) -> list[int]: + """ + Generate a sequence of unique random numbers. + + Args: + count: Number of random numbers to generate + config: Configuration settings for random number generation + + Returns: + list[int]: List of random numbers + """ + valid_numbers = [n for n in range(config.min_value, config.max_value + 1) + if n not in config.exclude_numbers] + + if len(valid_numbers) < count: + raise ValueError(f"Cannot generate {count} unique numbers in specified range") + + return random.sample(valid_numbers, count) + +def validate_random_number( + number: int, + config: RandomNumberConfig +) -> Union[bool, Dict[str, str]]: + """ + Validate if a number meets the random number criteria. + + Args: + number: Number to validate + config: Configuration settings to validate against + + Returns: + bool if valid, error dict if invalid + """ + if number < config.min_value: + return {"error": f"Number must be >= {config.min_value}"} + + if number > config.max_value: + return {"error": f"Number must be <= {config.max_value}"} + + if number in config.exclude_numbers: + return {"error": "Number is in exclude list"} + + return True + +def get_random_number_stats(numbers: list[int]) -> Dict[str, Union[int, float]]: + """ + Calculate statistics for a list of random numbers. + + Args: + numbers: List of numbers to analyze + + Returns: + Dict containing statistical measures + """ + if not numbers: + return { + "count": 0, + "min": 0, + "max": 0, + "mean": 0, + "median": 0 + } + + sorted_nums = sorted(numbers) + mid = len(sorted_nums) // 2 + + return { + "count": len(numbers), + "min": min(numbers), + "max": max(numbers), + "mean": sum(numbers) / len(numbers), + "median": sorted_nums[mid] if len(numbers) % 2 + else (sorted_nums[mid-1] + sorted_nums[mid]) / 2 + } + +def is_prime_number(number: int) -> bool: + """ + Check if a random number is prime. + + Args: + number: Number to check + + Returns: + bool: True if number is prime, False otherwise + """ + if number < 2: + return False + + for i in range(2, int(number ** 0.5) + 1): + if number % i == 0: + return False + + return True \ No newline at end of file