2010-10-05 64 views
3

我負責一個網站,並且我已經設置了一個「當日報價」,這個報價目前非常簡單。 See Here(在頁面的右側)如何設置自動「每日報價」?

它目前的功能是獲取月份和月份的日期,並將其歸一爲1,然後乘以引號數(存儲在xml文件中)並循環下。雖然這種方法會給我同樣的報價,無論我在哪個機器上(一個隨機數發生器永遠都不會做的事情),我已經指出這種方法是有缺陷的。如果你考慮一月份,第一對夫婦的報價將會是相同的,1 * 1/360,2 * 1/360,3 * 1/360,因此報價並不是唯一的。

任何人都可以想到一個更好的方式來選擇一天的報價嗎?

回答

1

有趣的問題。爲什麼不計算自某個特定日期以來的天數,而不是依賴於該月的幾天? JS爲此提供了一個相當不錯的屬性:getTime(),它給出了自1970年1月1日上午12點以來的毫秒數,您可以通過一些簡單的劃分轉換爲日期。

使問題複雜化的唯一原因是,如果您希望您的報價在午夜時間轉換(而誰不?),你必須考慮到時區。同樣,JS提供了getTimezoneOffset(),它將用戶的區域設置提前或延遲的分鐘數與UTC進行比較。如果您希望所有用戶同時翻轉,無論他們居住在哪裏,只需將其設置爲靜態值即可。

你的代碼可能看起來是這樣的:

var intQuoteCount = 51; // The number of quotes in your library 
var dtNow = new Date(); 
var intTZOffset = dtNow.getTimezoneOffset() * 60000; // automatically adjust for user timezone 
var intNow = dtNow.getTime() - intTZOffset; 
var intDay = Math.floor(intNow/86400000); // The number of 'local' days since Jan 1, 1970 
var intQuoteToDisplay = intDay % intQuoteCount; 
+0

乾杯安德魯!我不知道getTime()函數 – adustduke 2010-10-06 12:00:24

0

你可以嘗試在平日裏四捨五入,在奇怪的一天四捨五入。但我相信有更好的方法,這只是一個快速的建議。

此外,您可以嘗試在計算中使用一年中的當前日期,因爲這是每年在新的一天中唯一的一次,而不是每個月重複一次。

0

您是否必須限制360天的週期?如果你有例如500個報價。有些可能永遠不會被使用。
怎麼樣 - 每天選擇一個介於1和#OfQoutes之間的隨機數,將其用作日指數的報價,並將其標記爲「當前週期中使用」。
當您選擇一個數字時,如果您選擇一個標記爲「在當前週期中使用」的報價,請重新挑選,直到您獲得未標記的報價數量。當所有的引號被標記時,取消標記所有引號。
這將確保您在每個週期中都會查看所有報價以及隨機性,並且顯然適用於任意數量的報價。

1

確實,決定論是「隨機數發生器永遠不會做的事情」。幸運的是(至少在這種情況下),編程語言提供了 - 隨機數發生器,而不是真實的東西。僞隨機數是通過對「種子」值進行一堆計算而生成的。

爲了得到一個可重複的「隨機」選擇,那麼你所需要做的就是設置種子的方式是每天保持一致 - 我建議使用「yyyymmdd」格式的日期作爲種子,但任何其他的數字在一天中都不會改變,也同樣適用。

一旦你有你的種子,告訴PRNG與命令srand(mySeed);使用它,你會從rand()每次(直到mySeed變化)獲得「隨機」相同的數字序列。

+0

我所做的正是這一點上的網站之前。這也意味着你不會在例如每個1月1日。 – pjmorse 2010-10-05 16:39:11

+1

如果唯一可用的語言是JavaScript,其'Math.random()'不支持播種,則這可能無效。 – Andrew 2010-10-05 17:09:09

+0

@Andrew:Hrmph!我並不知道JS的PRNG中存在這種限制。感謝您的監督。 – 2010-10-05 23:42:36

1

如果您想要按順序顯示報價單,您可以獲得當前的Julian Day號碼,該號碼將每天增加一個,並在將報價除以今日報價的報價數量後進行提醒。如果你想顯示所有的引號,但是隻顯示它們的順序來改變每個週期,你可以對引號進行異或並使用你從分度商得到的邏輯重新排列位。

0

<body onLoad="thoughts_authors()"> 
 
<script> 
 
function thoughts_authors() 
 
{ 
 

 
var authors=new Array() 
 
authors[0] = "Charles Schulz"; 
 
authors[1] = "Jack Wagner"; 
 
authors[2] = "Mark Twain"; 
 
authors[3] = "Oscar Wilde"; 
 
authors[4] = "David Letterman"; 
 
authors[5] = "Lily Tomlin"; 
 

 
var thoughts=new Array() 
 
thoughts[0] = "Good Day Is Today"; 
 
thoughts[1] = "Style Is What You Choose"; 
 
thoughts[2] = "Be The Best Version Of You."; 
 
thoughts[3] = "Truth Along Triumphs."; 
 
thoughts[4] = "How can Life Be Devastating When YOU Are Present in It."; 
 
thoughts[5] = "Believe In What You Say"; 
 

 
index = Math.floor(Math.random() * thoughts.length); 
 

 
alert(thoughts[index]+ "-" + authors[index]); 
 

 
} 
 
</script>

這將生成隨機ALONG報價時,隨機作者