簡體   English   中英

生成兩個隨機數,使一個總是大於另一個

[英]Generate two random numbers so that one is always greater than the other

我正在對我的函數myFunc()的以下問題進行壓力測試。

有一座石橋連接兩座城市。 從一個城市開始的第一塊石頭上刻有 1,最后一塊石頭在另一個城市一側。 除了最后一塊石頭上可能刻有一個或兩個數字,這取決於 N 的值,每個后續的石頭上都有兩個連續的數字。 石頭可以排列為 1, (2, 3), (4, 5), ( 6, 7) ... N。

給你一個數字 N,代表最后一塊石頭上的最后一個數字; 和一個數字 X。任務是找到從第一個城市一側或第二個城市一側到達刻有 X 的石頭所需的最少跳躍次數。 注意:在第一塊石頭上跳躍將計為 0 次跳躍。

示例:輸入:2 10 3 5 1

輸出:1 0

說明: 測試用例 1:N = 10 的石頭對齊如下: 1, (2, 3), (4, 5), (6, 7), (8, 9), 10 要在 X = 3 上跳轉,你只需要從第一城一側跳一次(因為第一次跳石不計算在內),從第二側跳4次。 所以 1 和 4 的最小值是 1。

測試用例 2:N = 5 的石頭對齊方式如下: 1, (2, 3), (4, 5) 要在 X = 1 上跳躍,您只需要從 First 開始零次跳躍(因為第一次石頭跳躍不會被計算在內)城邊,從第二城邊跳2次。 所以 0 和 2 的最小值是 0。

#include <iostream>
#include <algorithm>
#include <ctime>
using namespace std;

int myFunc(int n, int p) {
    return p / 2;
}

int findJumps(int n, int p){
    return min(X /2, (N / 2) - (X / 2));
}
int main() {
    int n, x;
    srand(time(0));
    while(true) {

        n = rand() % 40 + 1; // I want n to be always greater than x
        x = rand() % 40 + 1;
        if(myFunc(n, x) != findJumps(n, x)) {
            cout << n << " " << x;
            break;
        }

        else cout << n << " " << x;
        cout << endl;
    }
    return 0;
}

我想要我的代碼是在無限循環范圍內生成 N 總是大於 X 。 我怎樣才能執行這個條件?

讓我首先建議您避免使用rand (根本)和%將其輸出限制在特定范圍內。 如果您真的堅持這樣做,請跳到下面的C 庫部分,以至少半合理的方式。

現代圖書館

C++ 11 引入了一組新的類來生成隨機數,並將隨機數減少到指定的范圍。 不過,使用它們是一種混合包——有些部分(如播種)有點困難,而其他部分(如縮小到一個范圍)則相當簡單——至少如果你關心把工作做好的話。

我還注意,如果0 <X <n,則在下限n必須是2 ,而不是1

使用 C++ 11 隨機數生成類,您可以按以下一般順序執行某些操作:

std::mt19937 gen{ std::random_device()() };

// ...

int n = std::uniform_int_distribution<int>(2, 40)(gen);
int x = std::uniform_int_distribution<int>(1, n)(gen);

如果你真的關心隨機數的質量,你可能想要更進一步——現在,它只使用std::random_device的一個返回值來為生成器提供種子,但 mt19937 生成器實際上有一個比那個大得多的狀態,所以更大的種子會更好。 如果你想進入這個,你可能想把std::seed_seq作為起點。

C 庫

如果您打算使用rand()%將您的數字減少到正確的范圍,我想我會首先編寫一個小函數來生成指定范圍內的隨機數1

int rand_range(int lower, int upper) { 
    int range = upper - lower;

    return rand() % range + lower;
}

然后我會用它來生成數字:

n = rand_range(2, 40);
x = rand_range(1, n);

[如上所述, n下限必須是 2。]

另一種可能性是生成兩個數字,然后如果它們的順序錯誤,則交換它們。 盡管如此,這仍然存在它們相等的可能性,而消除這種可能性會更費力——因此前面的建議只是確保當你生成x ,它總是嚴格小於n


1. 請注意,除非rand()的范圍恰好是40的倍數(這不太可能rand() ,否則使用%像這樣會產生有偏差的結果。 如果你想做得更好,你可以查看https://stackoverflow.com/a/2999130/179910以獲得某種改進的方法——但現代圖書館部分中顯示的標准發行版確實是正確的方法.

正如 Mark Ransom 所指出的,我遇到的一個簡單而好的解決方案是簡單的檢查if(x > n) swap(n, x)

因此,驅動程序代碼可能如下所示:

int main() {
int n, x;
srand(time(0));
while(true) {

    n = rand() % 40 + 1; // I want n to be always greater than x
    x = rand() % 40 + 1;
    if(x > n) swap(n, x);
    if(myFunc(n, x) != findJumps(n, x)) {
        cout << n << " " << x;
        break;
    }

    else cout << n << " " << x;
    cout << endl;
}
return 0;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM