照着别人写的js库,重新写了一个c版本的,也学了一下其中的算法。为什么需要松圆盘采样这个算法进行采样,是因为存随机其实也不是纯随机,随机分布不均匀。而这样生成的伪随机(psuedorandom)数列,很大程度保证了随机的均匀性。
开始以为很难,边写边学发现其实原理不太难。
基本思想就是,初始点可以给定或者随机。
第二步根据初始点,按照一定角度生成不同方向的新点,其中这个角度是关键。通过三角函数,保证生成的新点到初始点的距离为r。
第三步判断新生成点跟周围两个区域的点的距离,保证距离大于r。如果点不合法,则改变角度,重新生成。有一个重试次数保证重新生成上限,如果达到上限还没有找到一个新点,就说明这个点有问题,进行删除。如果合法,生成的点作为一个选择点并插入队列,作为下一次判断的初始点
第四步,队列中有其他生成点,继续上边第二第三步,直到没有生成点可以用。
期间我看js版本生成随机数的时候用的自己写的伪随机生成数,然后我就看了一下用的库,发现里边用了一个Thomas Wang写的 hash生成随机数,又简单看了一下。都是位操作,也懒得找原理看。先记一下,以后用到再看原理吧。
Read more...
Archive for C语言
操作系统编写-hello world
clear主要作用是清屏
ax=0600h初始化屏幕
cx起始位置
dx结束位置
然后调用bios中断
clear下边是设置光标的位置
ah=02h
dh行,dl列
DispStr主要打印hello world
详细介绍google搜索得到。
boot/boot.asm代码:
Read more...
org 07c00h
mov ax,cx
mov ds,ax
mov es,ax
call clear
call DispStr
jmp $
clear:
mov cx,00h
mov dx, 2580h
mov bh, 00h
mov ax, 0600h
int 10h
mov bh, 00h
mov dh, 11h
mov dl, 00h
mov ah, 02h
int 10h
ret
DispStr:
mov ax,BootMessage
mov bp, ax
mov cx, 12
mov ax, 1301h
mov bx, 000ch
mov dl, 0
int 10h
ret
BootMessage: db "hello, world!"
times 510-($-$$) db 0
dw 0xaa55
操作系统编写环境搭建
lisp群里有人写操作系统,我又想起了以前写的。以前写的没做完,当时有很多不明白的,现在决定看书再做一遍。
环境搭建:系统是ubuntu,编译器gcc,make,nasm,虚拟机bochs,然后应该没了。
bochsrc.txt文件配置
floppya: image=./img/a.img, status=inserted,加载软盘镜像
ata0-master: type=disk, path="./img/c.img", mode=flat, cylinders=20, heads=16, spt=63, 硬盘镜像,这个还没用,建了个10M的文件
boot: floppy,,启动顺序
#boot: disk
log: ./log/bochsout.txt 日志记录
parport1: enabled=1, file="./log/parport.out"# 并口的数据记录文件
应该在没啥了,有错误可以再改。
Makefile文件配置
Read more...
build/boot : boot/boot.asm nasm boot/boot.asm -o build/boot a.img : build/boot dd if=build/boot of=img/a.img bs=512 count=1 conv=notrunc run : a.img bochs clean : rm build/boot每次直接make run就可以了
~/code/os$ tree . ├── bochsrc.txt ├── boot │ └── boot.asm ├── build │ └── boot ├── img │ ├── a.img │ └── c.img ├── log │ ├── bochsout.txt │ └── parport.out └── Makefile目录结构,先这样了。慢慢添加
python源码阅读感想
啃了python源代码,从python.c开始慢慢看到token获取,学到很多东西,但是我看到python源代码也有很多可以优化的地方。很多参数、变量可以不要的,同样的判断在不同地方使用的不同方法,我靠看的我晕头转向。一到晕头转向的时候,我就重新从有疑问的地方再走一遍,认真看关键代码,然后才能看懂这一部分的功能。
语言的基本语法想个差不多了,天马行空了一下,与开始想的差距太大。
Read more...
llvm clang编译
1 安装
下载的最新的3.4, http://llvm.org/releases/download.html#3.4
Clang source code (.sig)
LLVM source code (.sig)
Compiler RT source code (.sig)
官方安装文档:http://llvm.org/docs/GettingStarted.html#getting-started-quickly-a-summary
下载的源码主要解压到正确目录就行了.
mkdir build
cd build
../configure
make
make install
编译的二进制文件在llvm-3.4/build/Release+Asserts/bin
搞定了
clang --version
clang version 3.4 (tags/RELEASE_34/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
源里边最新的是3.3的
2 写一个c的hello world
Read more...
#include
int main() {
printf("hello world\n");
return 0;
}
听说clang比gcc速度快。
clang hello.c -o hello
这里和gcc生成一样的系统执行文件
生成llvm的字节码文件
clang -O3 -emit-llvm hello.c -c -o hello.bc
两种形式运行
./hello
lli hello.bc
毕业设计题目
老师说要实现一个在线c语言学习的网站,引导用户一步一步编程。
找到这个网站:http://www.codecademy.com,准备以这个网站为原型设计。这个也不错http://www.paomianba.com/astar/
需要一个一步一步的引导语,一个代码框,再一个代码保存的功能。代码运行这个先不考虑,安全性我还没考虑好。
加入用户登录功能,记录学习进度。加入每个步骤的提问,评论功能。
后台能够添加教程。
难度主要在代码输入编辑框中后,检测输入是否正确。
代码框准备使用http://ace.ajax.org/。前端使用js与服务器进行数据交互,判断是否正确。
后台代码用python写,框架不准备用django了,笨了点,使用tornado或者web.py,这两个文档都有看,就是没有实践一下了。数据库还是用mysql,查查资料,看看换个,借机学学其他数据库。
Read more...
USACO Training--Friday the Thirteenth学习笔记
解决问题的方法真的有好多种,有的可以用很少的代码实现,好佩服。
自己写的代码:
Read more...
/*
ID:
LANG:C
TASK:friday
*/
#include
int main()
{
int i,j,n,a[7]={0},t;//t
FILE *fin=fopen("friday.in","r");
FILE *fout=fopen("friday.out","w");
fscanf(fin,"%d",&n);
for(i=0;i
看到蔡勒公式,感觉有意思 记录一下,说不定会用到
蔡勒公式是一种计算任何一日属一星期中哪一日的算法,由蔡勒(Julius Christian Johannes Zeller)推算出。
公式都是基于公历的置闰规则来考虑。
公式中的符号含义如下:
w:星期
c:世纪(前两位数)
y:年(后两位数)
m:月(m 的取值范围为 3 至 14,即在蔡勒公式中,某年的 1、2月要看作上一年的 13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算)
d:日
[ ]:称作高斯符号,代表取整,即只要整数部份。
mod:同余(这里代表括号里的答案除以 7 后的余数)(请注意前面是负数取模的情况,取模只可以是正数)
若要计算的日期是在1582年10月4日或之前,公式则为
(因罗马教皇修改历法,把1582年10月4日的下一天改为1582年10月15日)
USACO Training--Greedy Gift Givers学习笔记
今天做完百度acm的题,群里几个人在讨论各个学校的acm队伍、学习等。说到一起做USACO Training上的题目。我遍开始做了,以为这个网站是训练,是一个循序渐进的过程。做到Greedy Gift Givers这个题目,学到很多东西,记录一下。
这个题目很简单,不需要神马高深的算法,主要学到许多c语言的用法,先上我自己写的代码。
Read more...
/*
ID:
LANG:C
TASK:gift1
*/
#include
struct gift
{
char name[15];
int get;
int give;
}g[10];
int main()
{FILE *fin=fopen("gift1.in","r");
FILE *fout=fopen("gift1.out","w");
int i,np;
fscanf(fin,"%d",&np);
for(i=0;i
这里学到的几点:
结构体里的get和give可以只用一个最后结果表示就行。
我自己写的查找字符串的操作遍历了结构图数组所有元素,可以直接break退出循环,看别人写的代码用while很好,记录下。
j=0;
while(strcmp(a[j],b)) j++;
操作系统课程设计--短作业优先作业调度
今天把操作系统作业做完了,本来以为很简单的一个程序几十行就写完了。没想到写了有二百行,各种添加变量,各种添加if,各种添加for,直接晕菜了。
写得很乱,说不定明天就忘记写得神马意思了。先贴出来,等上机的时候在优化一下。<操作系统课程设计--短作业优先作业调度>
code:
Read more...
#include
#include
#include
#define MAXNUM 5
#define MAXTIME 20
struct sjf
{
char name[8];
int arrivetime;
int servicetime;
int runtime;
int is_over;//是否运行完
int starttime;
int finishtime;
int turnaroundtime;
float rightturnaroundtime;
}p[MAXNUM];
static int j=0,k=0,l=0;//j当前正在执行的进程 k当前时间已经到达的最大进程 l是否没有进程运行
//读取进程数据
void readProcess()
{
int i;
char str[200];
FILE *fp;
char *token;
if ((fp=fopen("Process","rt"))==NULL)
{
printf("读取文件失败!\n");
getchar();
exit(1);
}
printf("|--------------------------------------|\n");
printf("|--进程名称--|--到达时间--|--服务时间--|\n");
for (i=0;i
C学习笔记1
#include
/* 用于将输入复制到输出的程序;第2个版本 */
main ( )
{
int c;
while ( (c = getchar ( ) ) != EOF )
putchar ( c );
}
g e t c h a r函数在没有输入时返回一个特殊值,这个特殊值不能与任何实际字符相混淆。这个值叫做E O F(End Of File,文件结束) 。必须把c说明成一个大到足以存放g e t c h a r函数可能返回的各种值的类型。之所以不把c说明成c h a r类型,是因为c必须大到除了能存储任何可能的字符外还要能存储文件结束符E O F。因此,把c说明成i n t类型的。
VC6.0打印输出EOF值发现是-1