Skip to content
Snippets Groups Projects
gentx.py 1.65 KiB
import random
from collections import defaultdict
import sys
from string import ascii_lowercase
from time import sleep

# There will be 26**ACCOUNT_LEN accounts
ACCOUNT_LEN = 1

# probability that a transaction is a deposit
# initially more transaction will be deposits since transfers from non-existent accounts will not be placed
DEP_PROB = 0.1

# probability that a transfer tries to empty out the balance
# recommend leaving this at 0 until you want to test illegal transaction detection
ILLEGAL_TRANSFER_PROB = 0.0

def random_account(): 
    return ''.join(random.choice(ascii_lowercase) for _ in range(ACCOUNT_LEN))
# 0 balance by default
balances = defaultdict(int)

if len(sys.argv) > 1:
    rate = float(sys.argv[1])
else:
    rate = 1.0

while True:
    if random.random() < DEP_PROB:
        account = random_account()
        amount = random.randrange(1,101)
        print(f"DEPOSIT {account} {amount}")
        balances[account] += amount
    else:
        illegal = random.random() < ILLEGAL_TRANSFER_PROB
        account = random_account()
        if balances[account] == 0 and not illegal:
            continue
        if illegal:
            amount = random.randrange(balances[account]+1, balances[account]+101)
        else:
            amount = random.randrange(1, balances[account]+1)

        while True:
            # ensure _different_ account is the destination
            dest = random_account()
            if dest != account:
                break

        print(f"TRANSFER {account} -> {dest} {amount}")
        if not illegal: # update local balances
            balances[account] -= amount
            balances[dest] += amount
    sleep(random.expovariate(rate))