簡體   English   中英

如何根據日期選擇范圍內的隨機數?

[英]How to select a random number in a range based on date?

我有一個包含數百種Sector類型的列表,其ID值范圍為1..999。 用戶希望每天在網站上看到不同的隨機扇區。

解決此問題的一種方法是存儲當天隨機選擇的扇區ID,然后使用該ID,然后在第二天使用新的扇區ID更新該字段。 但這有點混亂,因為這意味着我需要在數據庫中的某個地方存儲任意值...(或者應用程序狀態或其他東西)

我也在想我可以取1..999的列表並使用一些隨機算法來根據日期選擇一個隨機數,所以只要日期與上一次選擇隨機數相同,相同的數字將出來。

但我不確定如何實現這一點,所以我在尋找建議?

此外,給定范圍的大小(999)和一年中可用天數(365),這是否意味着algorythm總是會錯過某些扇區,因為它們的ID不會映射到隨機數選擇過程選擇扇區ID? 有沒有辦法解決?

您可以將日期用作Random類的種子:

int day = (DateTime.Today - new DateTime(2000,1,1)).TotalDays;
Random rnd = new Random(day);
int id = rnd.Next(1, 1000);

請注意,日期是從固定的開始日期而不是DateTime.DayOfYear ,因此它不會每年重新啟動,只使用365個值。

你真的想要一個隨機值,或者你只想每天展示一個不同的扇區? Random提供了相同扇區信息連續兩天(或可能更多)顯示的可能性。 也很可能在365天的時間內,你會得到幾個副本。 使用999個項目列表中的隨機選擇,很可能會在365次嘗試中獲得365個非重復數字。

你有什么理由每年都要重新開始嗎? 為什么不設置一些日期(比如2011年1月1日)作為您的“紀元”日期。 然后,要選擇一個項目,只需從當前日期中減去該日期以獲得天數,除以999並取余數,為您提供索引。 那是:

DateTime EpochDate = new DateTime(2011, 01, 01);
TimeSpan Elapsed = DateTime.Now.Date - EpochDate;
int index = Elapsed.Days % 999;

此時, index是0..998范圍內的數字。 然后,您可以使用該編號索引您的扇區ID。 直接索引(因此2011年1月1日將獲得第一個扇區ID,1月2將獲得第二個,等等),或者對索引進行某種計算以“隨機化”它。

回答關於組合學的第二個問題:

您有999個號碼和365天。 您可以每天選擇一個隨機數,這意味着在任何情況下您都不能顯示超過365個(不同的)數字。 有些數字也可能重復。 您必須根據您想要表達的方式設計邏輯。

在這種情況下,您的隨機對象確實需要持續365天。

您可以使用Cache類並在午夜使內容過期。 當緩存條目不存在時,創建一個具有隨機值的新條目,在午夜到期...

對於隨機值,請使用System.Random - 無需在此處重新發明輪子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM