隨機數擴充
1)題目
給定一個等概率隨機產生1~5的隨機函式rand1To5如下:
public int rand1To5() {
return (int) (Math.random() * 5) + 1;
}
除此之外不能使用任何額外的隨機機制,請用rand1To5實現等概率隨機產生1~7的隨機函式rand1To7。
Random random = new Random();
int y = random.nextInt(5)*5+random.nextInt(5);
if(y >= 0 && y<= 20)
{
System.out.println(y%7+1);
}
(2)補充題目
給定一個以p概率產生0,以1-p概率產生1的隨機函式rand01p如下:
public int rand01p() {
// you can change p as you like
double p = 0.83;
return Math.random() < p ? 0 : 1;
}
除此之外不能使用任何額外的隨機機制,請用rand01p實現等概率隨機產生1~3的隨機函式rand1To3。
public int rand01p() {
// you can change p as you like
double p = 0.83;
return Math.random() < p ? 0 : 1;
}
public int rand01Or10() {
int num;
do {
num = rand01p();
} while (num == rand01p());
return num == 1 ? 1 : 0;
}
public void rand1to3()
{
int x = rand01Or10()*2 + rand01Or10();
System.out.println(x);
}
(3)進階題目
給定一個等概率隨機產生1~M的隨機函式rand1ToM如下:
public int rand1ToM(int m) {
return (int) (Math.random() * m) + 1;
}
除此之外不能使用任何額外的隨機機制。有兩個輸入引數分別為m和n,請用rand1ToM(m)實現等概率隨機產生1~n的隨機函式rand1ToN。
public int rand1ToM(int m) {
return (int) (Math.random() * m) + 1;
}
public int rand1ToN(int n, int m) {
int[] nMSys = getMSysNum(n - 1, m);
int[] randNum = getRanMSysNumLessN(nMSys, m);
return getNumFromMSysNum(randNum, m) + 1;
}
// 把value轉成m進位制的數
public int[] getMSysNum(int value, int m) {
int[] res = new int[32];
int index = res.length - 1;
while (value != 0) {
res[index--] = value % m;
value = value / m;
}
return res;
}
// 等概率隨機產生一個0~nMsys範圍上的數,只不過是m進製表達的。
public int[] getRanMSysNumLessN(int[] nMSys, int m) {
int[] res = new int[nMSys.length];
int start = 0;
while (nMSys[start] == 0) {
start++;
}
int index = start;
boolean lastEqual = true;
//精粹,控制隨機數的範圍在0~n-1(m進製表示)之間
while (index != nMSys.length) {
res[index] = rand1ToM(m) - 1;
if (lastEqual) {
if (res[index] > nMSys[index]) {
index = start;
lastEqual = true;
continue;
} else {
lastEqual = res[index] == nMSys[index];
}
}
index++;
}
return res;
}
// 把m進位制的數轉成10進位制
public int getNumFromMSysNum(int[] mSysNum, int m) {
int res = 0;
for (int i = 0; i != mSysNum.length; i++) {
res = res * m + mSysNum[i];
}
return res;
}
相關文章
- js隨機數生成器的擴充套件JS隨機套件
- 洗牌演算法擴充(從n個數中隨機m個數)演算法隨機
- php 擴充套件安裝(隨筆)PHP套件
- 【原創】開源Math.NET基礎數學類庫使用(12)C#隨機數擴充套件方法C#隨機套件
- 隨機數隨機
- python生成隨機數、隨機字串Python隨機字串
- 擴充套件叢集blk數套件
- 數論分塊擴充套件套件
- Spring容器擴充套件機制Spring套件
- MOSN 擴充套件機制解析套件
- 隨機範圍小數和隨機範圍整數隨機
- 剩餘引數、擴充運算子
- es6-數值擴充套件套件
- Linux Shell 生成隨機數和隨機字串Linux隨機字串
- 搞懂Dubbo SPI可擴充機制
- Matlab 隨機生成兩個數值之間的隨機數Matlab隨機
- UA MATH563 概率論的數學基礎 中心極限定理6 獨立隨機變數的和與Kolmogorov擴充套件定理H5隨機變數Go套件
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- JavaScript 生成隨機數JavaScript隨機
- C++ 隨機數C++隨機
- Js Math隨機數JS隨機
- 明明的隨機數隨機
- 隨機數漫談隨機
- Spring系列-XML schema擴充套件機制SpringXML套件
- 聊聊spring的那些擴充套件機制Spring套件
- 1.2 - Laravel 5.6 - Extend 擴充套件機制Laravel套件
- Linux虛擬機器擴充套件磁碟Linux虛擬機套件
- Python如何隨機生成1到100的隨機數?Python隨機
- 偽隨機數是什麼?偽隨機數生成方法有哪些?隨機
- Java 隨機數探祕Java隨機
- matlab 生成隨機數序列Matlab隨機
- C++生成隨機數C++隨機
- 隨機數生成器隨機
- MATLAB設定隨機數Matlab隨機
- java隨機數生成原理Java隨機
- R產生隨機數隨機
- 100ASK_IMX6ULL-PRO 數碼相框擴充專案:支援相機
- 【Kotlin】擴充套件屬性、擴充套件函式Kotlin套件函式
- 淺析Dubbo的SPI擴充套件機制套件