首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >随机数组

随机数组
EN

Stack Overflow用户
提问于 2014-04-07 03:48:25
回答 4查看 873关注 0票数 0

我正在尝试创建一个用于基本银行功能的控制台应用程序。我理解随机数生成器的工作原理,但我需要设置一个数组,以便随机数不会重复,因为生成的随机数代表用户的个性化PIN号。我该如何在我当前的代码中实现它呢?

代码语言:javascript
复制
class BankAccount
{
    private string firstName;
    private string lastName;
    private int accountNumber;
    private decimal balance;
    static public int customers = 0;
    private int pinNumber;

    public decimal Balance
    {
        get
        {
            return balance;
        }
        set
        {
            if (value >= 0)
                balance = value;
            else
            {
                Console.WriteLine("There will be an overdraft fee of $10.00.");
                balance = value - 10;
            }
        }
    }

    public string FirstName
    {
        get
        {
            return firstName;
        }
    }

    public string LastName
    {
        get
        {
            return lastName;
        }
    }

    public int AccountNumber
    {
        get
        {
            return accountNumber;
        }
    }

    public int PinNumber
    {
        get
        {
            return pinNumber;
        }
    }

    public BankAccount(string firstNameValue, string lastNameValue)
    {
        firstName = firstNameValue;
        lastName = lastNameValue;
        accountNumber = customers + 1;
        Random pin = new Random();
        pinNumber = pin.Next(1111, 9999);
        Balance = 0;
        customers++;
    }

    public BankAccount()
    {
        Balance = 0;
        customers++;
    }

    public void Credit(decimal amount)
    {
        Balance = Balance + amount;
    }

    public void Debit(decimal amount)
    {
        if (amount > Balance)
            Console.WriteLine("Debit amount exceeded account balance.");
        Balance = Balance - amount;
    }

    public static decimal AverageBalance(BankAccount[] accounts)
    {
        int count = 0;
        decimal total = 0;
        for (int i = 0; i < accounts.Length; i++)
        {
            if (accounts[i] != null)
            {
                total += accounts[i].Balance;
                count++;
            }
        }
        return total / count;
    }
}
EN

回答 4

Stack Overflow用户

发布于 2014-04-07 03:56:44

执行new Random()时,.Net使用当前时间作为种子。如果您在短时间内多次执行此操作,则会生成相同的随机数串。您可能只想在BankAccount中创建一个static Random变量。

代码语言:javascript
复制
static Random random = new Random();

// later, in the constructor
pinNumber = random.Next(0, 10000); // 0 <= pinNumber < 10000

我更改了Next上的范围,以便它将在全范围内生成。

票数 2
EN

Stack Overflow用户

发布于 2014-04-07 04:17:07

此方法使用不同的随机数初始化数组。我没有测试它,但它应该可以工作。创建一个数组,使用下面的代码初始化它,然后将它传递给您的方法。

代码语言:javascript
复制
public void SetValues(int[] array)
    {
        Random randomNumber = new Random();

        for (int i = 0; i < array.Length; i++)
        {
            bool distinctNumber = true;
            int number = randomNumber.Next(1, 100);
            for (int j = 0; j < i; j++)
            {
                if (number == array[j])
                {
                    distinctNumber = false;
                    break;
                }
            }
            if ( distinctNumber )      
                array[i] = number;
            else
                --i;    
        }
    }
票数 0
EN

Stack Overflow用户

发布于 2014-04-07 04:27:35

虽然我不理解在PIN号码中重复数字的担忧,但解决方案应该非常简单。您的数组将只包含很少的(4)位数字,因此检查数字是否重复是没有问题的。最简单的方法是使用Contains方法,只有在数字唯一的情况下才追加。然而,Contains将查看数组中的所有数字,因此您应该将其初始化为您不允许的值(负值),或者使用列表构建它。

代码语言:javascript
复制
Random rnd = new Random();

var pin = new[] {-1, -1, -1, -1};

for(var i = 0; i < pin.length; i++)
   int nextDigit = rnd.Next(0, 10);
   while (pin.contains(nextDigit)){ nextDigit + rnd.Next(0, 10); }
   pin[i] = nextDigit;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22899099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档