js獲取[n,m]的隨機整數值

来源:https://www.cnblogs.com/liziyu91/archive/2018/02/12/8444789.html
-Advertisement-
Play Games

1.需要用到的方法: Math.random:取大於等於0到小於1之間的隨機數; Math.floor:向下取整; Math.ceil:向上取整; 2.看了一個面試題,要求有個函數fn,參數為n,需要返回[2,32]之間的n個整數。第一次寫的時候如下: 然後發現2到32包含2和32的時候是有31位數 ...


1.需要用到的方法:

Math.random:取大於等於0到小於1之間的隨機數;

Math.floor:向下取整;

Math.ceil:向上取整;

2.看了一個面試題,要求有個函數fn,參數為n,需要返回[2,32]之間的n個整數。第一次寫的時候如下:

var fn=function(n){
    var arr=[],num;
    for(var i=0;i<n&&n<32;i++){
        num=Math.floor(Math.random()*30+2);
        if(arr.indexOf(num)===-1){
            arr.push(num);
        }else{
            i--;
        }
    }
    return arr;
};
var a=fn(3);
console.log(a.sort());

  然後發現2到32包含2和32的時候是有31位數字的,在這裡我取錯了只是[2,32);然後才查了下random時大於等於0小於1的數,所以向下取整時始終是小於1*30+2的即32。

  而題目是要求包含2和32,我就想向上取整不就有了32,同時當隨機數為0時也就有2了,就有瞭如下的代碼:

var fn=function(n){
    var arr=[],num;
    for(var i=0;i<n&&n<32;i++){
        num=Math.ceil(Math.random()*30+2);
        if(arr.indexOf(num)===-1){
            arr.push(num);
        }else{
            i--;
        }
    }
    return arr;
};
var a=fn(31);
console.log(a.sort());

  然後運行,沒有結果瀏覽器卡住了,類似陷入死迴圈。我想了下才發現自己犯了個很低級的錯誤,等於2的時候只有random的值為0,而如果隨機數是隨機的無法確保什麼時候為0,如果一直沒取到0,就會一直i--,直到有0為止。運氣不好就會運行很久。所以改了代碼如下:

var fn=function(n){
    var arr=[],num;
    for(var i=0;i<n&&n<32;i++){
        num=Math.floor(Math.random()*31+2);
        if(arr.indexOf(num)===-1){
            arr.push(num);
        }else{
            i--;
        }
    }
    return arr;
};
var a=fn(31);
console.log(a.sort());

  改成向下取整當random的值小於1/31時,向下取整為0,這樣就得到2了,而這樣的區間比只是一個0的概率大的多,而最大數始終小於1*31+2,向下取整後就是32。

  總結:

  a.Math.random是取[0,1)的數;

  b.取[min,max]的隨機整數時使用如下公式:

  Math.floor(Math.random().(max-min+1)+min)

  c.取[min.max)的隨機整數時使用如下公式:

  Math.floor(Math.random().(max-min)+min)

  d.取(min,max]的隨機整數時使用如下公式:

  Math.floor(Math.random().(max-min)+min+1)

  上面的是由(min,max]即[min+1,max]代入b的公式算出來就可以。

  e.不要使用ceil,因為無法控制Math.random()什麼時候為0,同理如下:

  Math.ceil(Math.random().(max-min+1)+min)

  好像是取(min,max]之間的值,但是不清楚什麼時候就會取到min。使用random的取隨機整數的時候使用向下取整。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 簡介 在開發過程中,經常會使用到第三框架,我們通過一個pod install命令,很方便的就將第三方框架加到我們自己的項目中。 如果我們也想將自己寫的組件或庫開源出去,讓別人也可以通過pod install命令安裝自己的框架該怎麼做呢?下麵,我就教大家一步一步的將自己的pods發佈到CocoaPod ...
  • iOS開發過程中很大一部分內容就是界面佈局和跳轉,iOS的佈局方式也經歷了 顯式坐標定位方式 --> autoresizingMask --> iOS 6.0推出的自動佈局(Auto Layout)的逐步優化,至於為什麼推出自動佈局,肯定是因為之前的方法不好用(哈哈 簡直是廢話),具體如何不好用以及 ...
  • 越來越多公司,開始了組件化,你還要等到什麼時候...... 說到開發模式,我們最熟知的開發模式 MVC 或者最近比較熱門的MVVM。但是我今天說的組件化的開發,其實MVC不是一類的。它其實是····· 在實際工作中,尤其是參與過比較大的項目,同時,參與開發的成員比較多的情況下,隨著時間的不停的開發, ...
  • 這一次要繪製出波浪效果,也是小白的我第一次還望輕噴。首先當然是展示效果圖啦: 一.首先來說說實現思路。 想到波浪效果,當然我第一反應是用正餘弦波來設計啦(也能通過貝塞爾曲線,這裡我不提及這個方法但是在demo里這種方法也實現了),肯定要繪製一個靜態的波,然後通過不斷的對它平移刷新,這樣最簡單的波浪效 ...
  • Android Button Make 右側設置按鈕的屬性,可以即時看到效果,並即時生成對應的.xml 代碼,非常高效(當然熟練的話 自己手寫代碼更快) ...
  • 結論:使用合法屬性名,使用 . 和 [] 訪問都可以; 如果屬性名是數字,則必須用“”包圍,並且用 [] 方括弧訪問。 ...
  • 編寫Javascript的開發者都知道,JS雖然沒有類(ES6添加了class語法),但是可以模擬出OOP語言的類和麵向對象的概念,比如我們都知道的一句話,Javascript中處處是對象,而面向對象語言的特性是繼承,封裝,多態,抽象,而本文討論的是Javascript的繼承,Javascript的 ...
  • 瀏覽器引擎預設:webkit內核 一、輸入地址 當我們開始在瀏覽器中輸入網址的時候,現代瀏覽器就可以智能的匹配完整 url了,它會從歷史記錄,書簽等地方,找到已經輸入的字元串可能對應的 url,然後給出智能提示,讓你可以補全url地址。 如果輸入的地址和候選項很匹配,在敲下回車之前,chromium ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...