是否允許srand(0)具有與 相同的效果srand(1)?
C11, 7.22.2.2 srand 函式(重點添加):
srand 函式將該引數用作新偽亂數序列的種子,這些偽亂數將由后續呼叫 rand 回傳。
但是,在 glibcsrand(0)中具有與以下相同的效果srand(1):
/* We must make sure the seed is not 0. Take arbitrarily 1 in this case. */
if (seed == 0)
seed = 1;
因此,后續呼叫會回傳相同的偽亂數序列rand,這令人困惑。
額外:我們??看到在 MSVCsrand(0)中沒有與srand(1).
uj5u.com熱心網友回復:
是否允許 srand(0) 具有與 srand(1) 相同的效果?
您從語言規范中參考的文字并未另有說明,我也沒有任何其他理由不這么認為。您強調“新序列”一詞,但這絕不意味著不同的種子必須產生不同的序列。
事實上,您參考的描述絕不會將后續 PRN 序列的新穎性限制在呈現給的鍵的值上srand()。考慮這個函式,然后:
void rtest(void) {
srand(42);
int x1 = rand();
srand(42);
int x2 = rand();
if (x1 == x2) {
puts("equal");
} else {
puts("unequal");
}
}
我希望該函式的執行列印“相等”,更一般地說,在第一個之后生成的任意數量的 PRNsrand()將等于在第二個之后生成的相同數量。那么,從什么意義上說,第二次srand()呼叫是否履行了使用指定密鑰獲取新PRN 序列的義務?
“新”應該被理解為停止使用當前的偽亂數序列,并從一開始就使用以指定種子為特征的序列,而不管那是哪個序列。不要求不同的鍵表征不同的序列,盡管這會影響實作的感知質量。
uj5u.com熱心網友回復:
在這種情況下,“新序列”僅表示新開始的序列。查看 C11 §7.22.2.2p2 中的下一句:
如果
srand然后以相同的種子值呼叫,則應重復偽亂數序列。
這意味著srand(10);后面srand(10);創建了兩個保證相同的新序列,因此 new 在這種情況下并不意味著“唯一”。
沒有什么是停止的srand(0),srand(1)也是相同的順序。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/520284.html
