若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。
If you like this post, please click the ads on the blog or buy me a coffee. Thank you very much.
在固定範圍的數字內,要產生不重複的數字通常有兩種方法:抽牌與洗牌。
抽牌
利用陣列標記已經抽到的牌。若亂數取到被抽走的數字,則重新取亂數。
C++ Code
#include <iostream>
#include <cmath>
#include <ctime>
using namespace std;
int main() {
srand(time(NULL));
int a = 0, b = 0;
cout << "請輸入數字範圍[a, b](注意 a < b):";
cin >> a >> b;
int range = b - a + 1;
int marked[range];
int i = 0;
while(i < range)
{
int randNum = rand() % range;
if(marked[randNum] == 1) // 若亂數取到被抽走的數字,則重新取亂數。
continue;
marked[randNum] = 1; // 抽走的數字標記為 1
cout << randNum + a << ", ";
i++;
}
return 0;
}
Python Code
import random
nums = input("請輸入數字範圍[a, b](注意 a < b,並以,區分數字):")
nums = nums.split(",")
a, b = map(int, nums)
count = b - a + 1
marked = [0] * count
i = 0
while i < count:
randNum = random.randint(0, count - 1)
if marked[randNum] == 1: # 若亂數取到被抽走的數字,則重新取亂數。
continue
marked[randNum] = 1 # 抽走的數字標記為 1
print(randNum + a, end=", ")
i = i + 1
洗牌
此方法會建立一個陣列,存放所有要被抽的數字,每次隨機選出兩個數字,將兩個數字的位置(索引)交喚。交換次數可自行定義。
C++ Code
#include <iostream>
#include <cmath>
#include <ctime>
using namespace std;
int main() {
srand(time(NULL));
int a = 0, b = 0;
cout << "請輸入數字範圍[a, b](注意 a < b):";
cin >> a >> b;
int numOfExchange = 1000; // 洗牌次數
int range = b - a + 1;
int numbers[range];
for(int i = 0; i < range; i++) // 指定陣列的數字
numbers[i] = a + i;
for(int i = 0; i < numOfExchange; i++) {
int iIdx = rand() % range; // 隨機抽兩個數字
int jIdx = rand() % range;
// 交換兩個數字的索引位置
int temp = numbers[iIdx];
numbers[iIdx] = numbers[jIdx];
numbers[jIdx] = temp;
}
for(int i = 0; i < range; i++) {
cout << numbers[i] << ", ";
}
return 0;
}
Python Code
import random
nums = input("請輸入數字範圍[a, b](注意 a < b,並以,區分數字):")
nums = nums.split(",")
a, b = map(int, nums)
count = b - a + 1
numbers = [0] * count
for i in range(1, count + 1):
numbers[i - 1] = i # 指定陣列的數字
numOfExchange = 1000 # 洗牌次數
for i in range(numOfExchange):
# 隨機抽兩個數字
iIdx = random.randint(0, count - 1)
jIdx = random.randint(0, count - 1)
# 交換兩個數字的索引位置
temp = numbers[iIdx]
numbers[iIdx] = numbers[jIdx]
numbers[jIdx] = temp
print(numbers)
沒有留言:
張貼留言