2013年11月6日 星期三

隨手寫寫 - 蜜蜂螫

蜜蜂螫,
妳覺的痛,
但妳可知道這燃燒了我全部生命,
我懂,這一下我再不是妳面前飛舞的可愛蜜蜂,
但如果不,就如同在妳生命中我從未出現過。

2013年2月14日 星期四

C++ 程式設計筆記 - 奇點亂數產生器[原創]

之前因為一些緣由需要設計一個亂數產生器,原本使用線性同餘法設計,線性同餘法的亂數產生器可由如下程式碼即可產生:

Seed = (Seed * Multiplier + Increment) % Modulos;

但測試後發現這樣產生的亂數有個非常大的問題就是產生的 Seed 如果曾經出現過那麼之後的亂數就會完全重複而產生循環,於是決定設計一個改良的亂數產生器,實作的程式碼如下:

GravitationalSingularityRandom.h :

class GravitationalSingularityRandom
{
private:
  long Seed;
  long Multiplier;
  long SourceIncrement;
  long Modulos;
  long TargetIndex;
  long TargetIncrement;
  unsigned char BufferRandom[256];
public:
  GravitationalSingularityRandom(long RandomSeed = 0);
  ~GravitationalSingularityRandom();
  void Random(unsigned char * Buffer, long Size);
};


GravitationalSingularityRandom.cpp :

#include "GravitationalSingularityRandom.h"

GravitationalSingularityRandom::GravitationalSingularityRandom(long RandomSeed)
{
  long i;
  Seed =  RandomSeed;
  Multiplier = 2593;
  SourceIncrement =  3079;
  TargetIncrement = 17;
  Modulos = 65537;
  TargetIndex = 0;
  for (i = 0; i < 256; i++)
  {
    BufferRandom[i] = (unsigned char) i;
  }
}

GravitationalSingularityRandom::~GravitationalSingularityRandom()
{
}

void GravitationalSingularityRandom::Random(unsigned char * Buffer, long BufferSize)
{
  int i;
  long SourceIndex = 0;
  unsigned char RandomMoving = 0;
  for (i = 0; i < BufferSize; i ++)
  {
    Seed = (Seed * Multiplier + SourceIncrement) % Modulos;
    SourceIndex = (Seed & 0xFF);
    TargetIndex = ((TargetIndex + TargetIncrement) & 0xFF);
    RandomMoving = BufferRandom[SourceIndex];
    BufferRandom[SourceIndex] = BufferRandom [TargetIndex];
    BufferRandom[TargetIndex] = RandomMoving;
    Buffer[i] = RandomMoving;
  }
}


一開始在建構式中產生一個大小為 0 - 255 的表格並在其中放入 0 - 255 的數字當作索引。程式碼中 Seed 、 Multiplier 、 SourceIncrement 跟 Modulos 都是用來產生線性同餘法的亂數所需的參數,但是卻不能將之直接拿來使用,而是拿來當表格的互換索引,也就是說線性同餘法所產生的亂數不是拿來直接使用而是用做此演算法所需的奇點,這點有點像是洗牌法但不同的是洗牌法是要產生連續不重複亂數,而這個作法是為了要避免亂數進入循環,並且產生的數值愈多接下來產生數值的複雜度也就愈高,經測試這個亂數產生器能產生非常接近自然亂數的數值。

2013年1月20日 星期日

運動健身筆記 - 運動健身以來的小小心得

前陣子在公司的游泳健身社月會做心得分享,為方便做心得的匯整,把內容節錄如下:

一、做重力訓練最大重點是訓練的頻率,做重力訓練時所做的事實上是破壞肌肉中的纖維組織,平時肌肉細胞因受纖維組織束袱,不易增長,故需做重力訓練對肌肉做相當的纖維組織破壞,並不是做重力訓練時肌肉會增長,而是重力訓練後大約一周內肌肉會增長,而且必需是在休息時肌肉才會增長,所以重力訓練後一段時間內不可再做重力相關訓練,一般建議頻率不可少於一週一次不可多於二天一次。

二、有氧訓練的頻率,一般建議一週三到五次,其原因為一週少於三次體力容易下降,多於五次運動效果與等於五次差不多,多於五次反而無法讓身體有充份休息的機會。

三、重力訓練器材的使用,以一遁環六下為原則,重力調整也以能支撐六下為原則,重力調整過高容易有運動傷害,過低效果不佳,如做完一遁環之後感覺該部位仍需加強再做一個遁環。

四、有氧訓練以一次三十分鐘為原則,三十分鐘的有氧訓練方能有效的提升心肺功能,並能分泌足量腦內啡達到舒解壓力的功效。

五、一般建議訓練順序為:跑步>重力>游泳,跑步能分泌大量腦內啡,如此可大幅降低重力訓練時的痛苦,而游泳可伸展重力訓練後的肌肉,有人提出游泳屬有氧運動會不會導致之前重力訓練的效果減少,這點的得分兩部份解釋,肌肉細胞變多變少還是肌肉細胞變大變小,重力訓練後一段時間內肌肉細胞會漸漸變多,但運動後因脂肪、醣類、蛋白質消耗,所以肌肉細胞快速變小,變多很慢變小很快,所以才有運動後肌肉先變小再變大的感覺,但變小的細胞補充營養後就會完全回復,所以游泳不會使重力效果降低。

六、模特兒的 BMI 參考值: 男模為 21 ~ 22 ,女模為 17 ~ 18。