程式語言如何產生不重複的數字(Non-Repeated Number)

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

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)


沒有留言: