我正在尝试为基本银行功能创建一个控制台应用程序。我理解随机数生成器是如何工作的,但我需要设置一个数组,以便随机数不重复,因为生成的随机数代表用户的个性化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;
}
}
答案 0 :(得分:2)
执行new Random()
时,。Net使用当前时间作为种子。如果您在短时间内多次执行此操作,则会生成相同的随机数字符串。您可能只想在static Random
中生成BankAccount
变量。
static Random random = new Random();
// later, in the constructor
pinNumber = random.Next(0, 10000); // 0 <= pinNumber < 10000
我更改了Next
的范围,以便在整个范围内生成。
答案 1 :(得分:0)
此方法初始化具有不同随机数的数组。我没有测试它,但它应该工作。 创建一个数组,使用下面的代码对其进行初始化,然后将其传递给您的方法。
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;
}
}
答案 2 :(得分:0)
虽然我不理解在PIN码中重复数字的问题,但解决方案应该非常简单。您的数组只包含很少(四)个数字,因此检查数字是否重复没有问题。最简单的方法是使用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;
}
答案 3 :(得分:0)
借助基于this excellent answer的Fisher-Yates shuffle借用扩展方法,这可以相对干净地完成。
首先定义一个扩展方法来混洗给定的List<T>
:
public static void Shuffle<T>(this IList<T> list)
{
Random rng = new Random();
int n = list.Count;
while (n > 1) {
n--;
int k = rng.Next(n + 1);
T value = list[k];
list[k] = list[n];
list[n] = value;
}
}
然后定义函数以生成由不同数字组成的PIN:
public IEnumerable GeneratePIN(){
var pinDigits = new List<int>(Enumerable.Range(0,10));
pinDigits.Shuffle();
return pinDigits.Take(4);
}
或者,作为更好的选择,您还可以使用更通用的引脚生成函数从任意类型生成任意长度的引脚。
public static IEnumerable<T> GeneratePIN<T>(IEnumerable<T> valueRange, int length)
{
var pinValues = new List<T>(valueRange);
pinValues.Shuffle();
return pinValues.Take(length);
}
也就是说,值得一提的是,将PIN限制为不同的值会将可能的PIN数量从10000减少到5040,从而降低其安全性。