《c和指標》筆記–讓rand更隨機一點

來源:互聯網
上載者:User

在c語言中如果要擷取1~10的隨機數,那麼可能大部分人的想法都是通過以下代碼擷取:

rand()%10+1;

(雖然rand產生的是一個偽隨機數,但是這邊姑且認為他是真隨機的吧)

但是產生1~10的機率真的是一樣的嗎?

不是的,下面我們來分析以下。

假如rand返回的最大值為105,那麼使用上面那種方法擷取的隨機數那麼產生1~6的機率要比產生7~10的機率要大,

看出來了嗎?因為如果rand函數傳回值的範圍為0~99,那麼使用上面的方式產生1~10的機率是一樣的,但是,

現在rand傳回值範圍為0~105,如果rand返回100,則rand()%10+1的值為1,相當於1的機率要比其他數要大一點,

依此類推,產生1~6的機率要大一點點。

所以如果要使產生的數更隨機一點,可以使用下面的代碼:

#include<stdlib.h>#include<stdio.h>int get_rand10( void ){int value;int max_rand = ( ( RAND_MAX + 1 ) / 10 ) * 10 -1;srand( (unsigned int) time(NULL) );do{value = rand();}while(value > max_rand);return value % 10 + 1;}

一般情況下不必使用上面的方法,但是需要產生的隨機數的最大值越接近於RAND_MAX,則越要考慮使用上面的方法。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.