我正在尝试创建一个用于基本银行功能的控制台应用程序。我理解随机数生成器的工作原理,但我需要设置一个数组,以便随机数不会重复,因为生成的随机数代表用户的个性化PIN号。我该如何在我当前的代码中实现它呢?
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;
}
}发布于 2014-04-07 03:56:44
执行new Random()时,.Net使用当前时间作为种子。如果您在短时间内多次执行此操作,则会生成相同的随机数串。您可能只想在BankAccount中创建一个static Random变量。
static Random random = new Random();
// later, in the constructor
pinNumber = random.Next(0, 10000); // 0 <= pinNumber < 10000我更改了Next上的范围,以便它将在全范围内生成。
发布于 2014-04-07 04:17:07
此方法使用不同的随机数初始化数组。我没有测试它,但它应该可以工作。创建一个数组,使用下面的代码初始化它,然后将它传递给您的方法。
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;
}
}发布于 2014-04-07 04:27:35
虽然我不理解在PIN号码中重复数字的担忧,但解决方案应该非常简单。您的数组将只包含很少的(4)位数字,因此检查数字是否重复是没有问题的。最简单的方法是使用Contains方法,只有在数字唯一的情况下才追加。然而,Contains将查看数组中的所有数字,因此您应该将其初始化为您不允许的值(负值),或者使用列表构建它。
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;
}https://stackoverflow.com/questions/22899099
复制相似问题